美文网首页
根据两个traversal恢复二叉树

根据两个traversal恢复二叉树

作者: codingcyx | 来源:发表于2018-04-13 18:07 被阅读0次

已知前序和中序遍历:

递归版本:

TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        int len = preorder.size();
        return buildCore(preorder, 0, inorder, 0, len);
    }
    TreeNode* buildCore(vector<int>& preorder, int start1, vector<int>& inorder, int start2, int num) {
        if(num == 0) return NULL;
        TreeNode* root = new TreeNode(preorder[start1]);
        if(num == 1) return root;
        int leftnum = 0, i = start2;
        //find in the inorder
        for(; i<start2 + num; i++){
            if(inorder[i] != preorder[start1])
                leftnum++;
            else break;
        }
        root -> left = buildCore(preorder, start1 + 1, inorder, start2, leftnum);
        root -> right = buildCore(preorder, start1 + leftnum + 1, inorder, i + 1, num - leftnum - 1);
        return root;
    }

非递归版本:

TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        int num = preorder.size();
        if(num == 0) return NULL;
        stack<TreeNode*> st;
        TreeNode* root = new TreeNode(preorder[0]), *cur = root;
        for(int i = 1, j = 0; i<num; i++){
            if(inorder[j] == cur -> val){
                j++;
                while(!st.empty() && st.top() -> val == inorder[j]){
                    cur = st.top();
                    st.pop();
                    j++;
                }
                cur -> right = new TreeNode(preorder[i]);
                cur = cur -> right;
            }
            else{
                cur -> left = new TreeNode(preorder[i]);
                st.push(cur);
                cur = cur -> left;
            }
        }
        return root;
    }

已知后序和中序遍历:
非递归:

TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        int len = inorder.size();
        if(len == 0) return NULL;
        stack<TreeNode*> st;
        TreeNode* root = new TreeNode(postorder[len-1]), *cur = root;
        st.push(root);
        for(int i = len-2, j = len-1; i>=0; i--){
            if(cur -> val != inorder[j]){
                cur -> right = new TreeNode(postorder[i]);
                st.push(cur);
                cur = cur -> right;
            }
            else{
                j--;
                while(!st.empty() && st.top() -> val == inorder[j]){
                    cur = st.top();
                    st.pop();
                    j--;
                }
                cur -> left = new TreeNode(postorder[i]);
                cur = cur -> left;
            }
        }
        return root;
    }

相关文章

网友评论

      本文标题:根据两个traversal恢复二叉树

      本文链接:https://www.haomeiwen.com/subject/mmlhkftx.html