请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图
题目描述如下:
请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图
输入:[1,2,4,5,3],[4,2,5,1,3]
返回值:[1,3,5]
本题目可以分为两个部分
- 重构二叉树
- 打印二叉树的右视图
1、重构二叉树思路
对于先序遍历而言,[1,2,4,5,3],列表中的1必定是二叉树的根节点,而中序遍历是左子树、根节点、右子树的顺序,故在[4,2,5,1,3]中根节点1的左边[4,2,5]就是左子树,而【3】就是右子树。
我们可以根据中序遍历的列表求得左右子树的节点数目,从而在先序遍历的列表中得到左右子树的先序遍历。
如示例[1,2,4,5,3],[4,2,5,1,3];
根节点 【1】
左子树的先序遍历【2,4,5】,中序遍历【4,2,5】
右子树的先序遍历【3】,中序遍历【3】
层层递归来构建二叉树。
TreeNode* buildTree(vector<int>& xianxu,int xianxu_l,int xianxu_r,
vector<int>& zhongxu,int zhongxu_l,int zhongxu_r)
{
if(xianxu_l>xianxu_r || zhongxu_l>zhongxu_r)
return nullptr;
TreeNode* root = new TreeNode(xianxu[xianxu_l]); //构建节点
int rootIndex = 0; //用来保存根节点在中序遍历列表的下标
//寻找根节点
for(int i=zhongxu_l;i<=zhongxu_r;i++)
{
if(zhongxu[i] == xianxu[xianxu_l])
{
rootIndex = i;
break;
}
}
int leftSize = rootIndex - zhongxu_l; //左子树大小
int rightSize = zhongxu_r - rootIndex; //右子树大小
//递归构建左子树和右子树
root