LeetCode 从前序与中序遍历序列构造二叉树(递归+图解)
程序员文章站
2024-02-01 10:01:16
...
根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
前序遍历:先根节点,后左子树,在右子树
中序遍历:先左子树,后根节点,在右子树
而左子树、右子树的构造又回到了一棵二叉树的构造,递归定义。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int orderSize;
vector<int> preorder;//类的属性,作用类似全局遍历
vector<int> inorder;
//preorder [preorderBegin, preorderEnd], inorder [inorderBegin, inorderEnd] 构造成一棵树
TreeNode* myBuildTree(int preorderBegin, int preorderEnd, int inorderBegin, int inorderEnd){
TreeNode *root = NULL;
if (preorderBegin == preorderEnd) {
root = new TreeNode(preorder[preorderBegin]);
}
else if (preorderBegin < preorderEnd) {
root = new TreeNode(preorder[preorderBegin]);
int tempValue = preorder[preorderBegin];//根节点的值,因为preorder先序遍历先访问的根节点
int rootIndex = inorderBegin;//根节点在inorder的下标
while (rootIndex < inorderEnd && inorder[rootIndex] != tempValue) {//寻找根节点在inorder的下标
++rootIndex;
}
int leftCnt = rootIndex - inorderBegin;//左子树的节点个数
root->left = myBuildTree(preorderBegin + 1, preorderBegin + leftCnt, inorderBegin, rootIndex - 1);//构建左子树
root->right = myBuildTree(preorderBegin + leftCnt + 1, preorderEnd, rootIndex + 1, inorderEnd);//构建右子树
}
return root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
TreeNode* root = NULL;
orderSize = preorder.size();
int inorderSize = inorder.size();
if (orderSize == NULL || orderSize != inorderSize) {
return NULL;
}
this->preorder = preorder;//复制
this->inorder = inorder;
root = myBuildTree(0, orderSize - 1, 0, orderSize - 1);//构造
return root;
}
};
我发现作图的时间不会比敲代码的时间短,
希望之前没有理解这个构造过程的道友看了我的博客能理解这道算法题,一切都是为了分享。望诸君多多评论、交流。
上一篇: Struts2值栈的理解
推荐阅读
-
LeetCode 从前序与中序遍历序列构造二叉树(递归+图解)
-
java实现二叉树前序、中序、后序递归遍历详解步骤和图解
-
从前序与中序遍历序列构造二叉树 Java
-
105. 从前序与中序遍历序列构造二叉树
-
leetcode 105.从前序与中序遍历序列构造二叉树
-
leetcode 106. 从中序与后序遍历序列构造二叉树 105. 从前序与中序遍历序列构造二叉树思考分析
-
【LeetCode】二叉树各种遍历大汇总(秒杀前序、中序、后序、层序)递归 & 迭代
-
从前序与中序遍历序列构造二叉树-二叉树
-
java实现二叉树的前序、中序、后序、层次遍历,递归与非递归
-
LeetCode 105. 从前序与中序遍历序列构造二叉树(各种遍历二叉树的性质,递归建树)