对于左右子树对应的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; } };
参考:https://mp.weixin.qq.com/s?__biz=MzAxODQxMDM0Mw==&mid=2247487270&idx=1&sn=2f7ad74aabc88b53d94012ceccbe51be&chksm=9bd7f12eaca078384733168971147866c140496cb257946f8170f05e46d16099f3eef98d39d9&scene=21#wechat_redirect
原文:https://www.cnblogs.com/Ping697/p/14552072.html