【二叉树】二叉树恢复操作

二叉树的操作(C++实现)

/* Implement the function:
inorderTraversal: non-recursive version
Test:input P, T->buildTree->get the root-> output
*/
struct TreeNode {
    int val;
    TreeNode* left, *right;
    TreeNode(int x):val(x),left(NULL), right(NULL) {}
};

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> result;
        if (root == NULL) return result;
        stack<TreeNode*> stk;
        TreeNode* p = root;
        while (p || !stk.empty()) {
            while (p) {
                stk.push(p);
                p = p->left;
            }
            p = stk.top();
            stk.pop();
            result.push_back(p->val);
            p = p->right;
        }
        return result;
    }
    // the following is used to generate test examples for inorderTraversal
    TreeNode* buildTree(vector<int> P, vector<int> T) {
        if (P.size() != T.size()) return NULL;
        int len = P.size();
        TreeNode* root = helper(P, T, 0, len - 1, 0, len - 1);
        return root;
    }
    // This is used for creating a tree by inputting preorder and inorder tree.
    TreeNode* helper(vector<int>& P, vector<int>& T, int pt, int pd, int st, int ed) {
        cout << "st ed = " << st << " " << ed << endl;
        cout << "pt pd = " << pt << " " << pd << endl;
        if (st > ed) return NULL;
        TreeNode* root = new TreeNode(0);
        int val = P[pt], len = P.size();
        for (int i = st; i <= ed; i++) {
            if (T[i] == val) {
                root->left = helper(P, T, pt + 1, pt + i - st, st, i - 1);
                root->val = val;
                root->right = helper(P, T, pt + i - st + 1, pd, i + 1, ed);
                break;
            }
        }
        return root;
    }
};

测试

int main() {
    int n;
    int t;
    while (cin >> n) {
        TreeNode* root = new TreeNode(0);
        Solution sol;
        Solution2 sol2;
        TreeNode* tree = root;
        vector<int> inorder(n, 0), preorder(n, 0);
        for (int i = 0; i < n; i++)  {
            cin >> preorder[i];
        }
        for (int i = 0; i < n; i++) {
            cin >> inorder[i];
        }
        TreeNode* root2 = sol2.buildTree(preorder, inorder);
        vector<int> res = sol2.inorderTraversal(root2);
        for (int i = 0; i < res.size(); i++) {
            cout << res[i] << " ";
        }
        cout << endl;
    }
    return 0;
}
/*
Sample Input:
5
2 3 4 7 9
4 3 2 7 9

Sample Output:
4 3 2 7 9
*/

 

posted @ 2017-11-21 23:39  stackupdown  阅读(279)  评论(0)    收藏  举报