zoukankan      html  css  js  c++  java
  • 二叉树还原【前序+中序】【后续+中序】

    已知二叉树的中序加前序或后续可以还原出二叉树(:中序是必须知道的)

    • 前序:a b c
    • 中序:b a c
    • 后续:b c a

    1. 前序 + 中序

    思路

    对于例图中,由前序可知,第一个元素即a是根节点,从对应的中序中找到a。从而进一步知道其左边的b在左树中,其右边的c在右树中,这样结合前序递归可以还原出整个树。

    参考代码

    /**
     * Definition for binary tree
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        TreeNode* getTree(vector<int> &preorder, vector<int> &inorder, int prebeg, int preend, int inbeg, int inend)
        {
            if(prebeg < preend && inbeg < inend)
            {
                TreeNode *rev = new TreeNode(preorder[prebeg]);
                vector<int>::iterator mid = find(inorder.begin()+inbeg, inorder.begin()+inend, preorder[prebeg]);
                int span = mid - (inorder.begin() + inbeg);
                rev->left = getTree(preorder, inorder, prebeg+1, prebeg+1+span, inbeg, inbeg+span);
                rev->right = getTree(preorder, inorder, prebeg+1+span, preend, inbeg+span+1, inend);
                return rev;
            }
            return NULL;
        }
        TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
            return getTree(preorder, inorder, 0, preorder.size(), 0, inorder.size());
        }
    };

    2. 后序 + 中序

    思路

    对于例图中,由后序可知,最后一个元素即a是根节点,从对应的中序中找到a。从而进一步知道其左边的b在左树中,其右边的c在右树中,这样结合前序递归可以还原出整个树。

    参考代码

    /**
     * Definition for binary tree
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        TreeNode *getTree(vector<int> &inorder, vector<int> &postorder, int inbeg, int inend, int postbeg, int postend)
        {
            if (inbeg < inend && postbeg < postend)
            {
                TreeNode *rev =new TreeNode(postorder[postend-1]);
                vector<int>::iterator mid = find(inorder.begin()+inbeg, inorder.begin()+inend, postorder[postend-1]);
                int span = mid - (inorder.begin() + inbeg);
                rev->left = getTree(inorder, postorder, inbeg, inbeg+span, postbeg, postbeg+span);
                rev->right = getTree(inorder, postorder, inbeg+span+1, inend, postbeg+span, postend-1);
                return rev;
            }
            return NULL;
        }
        TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) {
            return getTree(inorder, postorder, 0, inorder.size(), 0, postorder.size());
        }
    };

    3. 细节

    利用vector引用的方式,可以避免每次复制导致空间利用过大,利用引用直接在原始空间内进行操作。

  • 相关阅读:
    UIView的clipsToBounds属性,layoutSubViews及触摸事件传递(默认情况下)总结
    ISO中运行时简单使用及KVC补充
    IOS中UISearchBar的使用
    oc的block
    oc的协议(protocol)
    oc的分类category
    oc内存的理解
    oc笔记(转载)
    oc对象中属性总结
    servlet,struts1,struts2,spring
  • 原文地址:https://www.cnblogs.com/kaituorensheng/p/3788533.html
Copyright © 2011-2022 走看看