首页 > 其他 > 详细

构造二叉树——105. 从前序与中序遍历序列构造二叉树

时间:2021-03-17 22:55:53      阅读:32      评论:0      收藏:0      [点我收藏+]

对于左右子树对应的inorder数组的起始索引和终止索引比较容易确定:

技术分享图片

 

 

即:

root.left = build(preorder, ?, ?,
                  inorder, inStart, index - 1);

root.right = build(preorder, ?, ?,
                   inorder, index + 1, inEnd);

 

对于preOrder前序遍历数组:

这个可以通过左子树的节点数推导出来,假设左子树的节点数为leftSize,那么preorder数组上的索引情况是这样的:

技术分享图片

 

看着这个图就可以把preorder对应的索引写进去了:

int leftSize = index - inStart;

root.left = build(preorder, preStart + 1, preStart + leftSize,
                  inorder, inStart, index - 1);

root.right = build(preorder, preStart + leftSize + 1, preEnd,
                   inorder, index + 1, inEnd);

 

 

 

技术分享图片
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    //root调用函数
    TreeNode* buildTree(vector<int>& preOrder, vector<int>& inOrder) {
        return buildNode(preOrder, 0, preOrder.size() - 1,
                        inOrder, 0, inOrder.size() - 1);
    }

    //--
    TreeNode* buildNode(vector<int>& preOrder,int preSta,int preEnd,
                        vector<int>& inOrder,int inSta,int inEnd){
        if(preSta > preEnd || inSta > inEnd){//超出边界,返回null
            return nullptr;
        }
        
        //--rootVal:每一轮函数中,构造的树的根节点,
        //--由 前序遍历的第一个节点得到,(前序遍历的第一个节点必定为根节点)
        int rootVal = preOrder[ preSta ];
        TreeNode *root = new TreeNode( rootVal );

        //--rootIndex_inOrder:寻找根节点在中序遍历列表的位置,
        //--用于 分隔 中序遍历列表的 左右两端
        int rootIndex_inOrder = 0;
        for(int i = inSta; i <= inEnd; i++){
            if(inOrder[ i ] == rootVal){
                rootIndex_inOrder = i;
                break;
            }
        }

        //--标记 前序遍历的左子树 在前序的列表的位置的偏移,详见图
        int in_LeftSide_Size = rootIndex_inOrder - inSta;
        
        //--分段方法 详见图
        root->left = buildNode(preOrder, preSta + 1, preSta + in_LeftSide_Size ,
                                inOrder, inSta, rootIndex_inOrder - 1);
        root->right = buildNode(preOrder, preSta + in_LeftSide_Size + 1 ,preEnd,
                                inOrder,rootIndex_inOrder + 1, inEnd);
        return root;
    }
};
View Code

参考:https://mp.weixin.qq.com/s?__biz=MzAxODQxMDM0Mw==&mid=2247487270&idx=1&sn=2f7ad74aabc88b53d94012ceccbe51be&chksm=9bd7f12eaca078384733168971147866c140496cb257946f8170f05e46d16099f3eef98d39d9&scene=21#wechat_redirect

技术分享图片

 

构造二叉树——105. 从前序与中序遍历序列构造二叉树

原文:https://www.cnblogs.com/Ping697/p/14552072.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!