栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

LeetCode 106/105 从中序和后序/前序遍历序列构造二叉树

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LeetCode 106/105 从中序和后序/前序遍历序列构造二叉树

原理:

请参考文章:数据结构笔记:二叉树的构造(根据遍历顺序构造二叉树)

先序遍历 中序遍历 后序序列组成情况,

 

 

106后序和中序构造二叉树

 题目链接:力扣

思路:  递归

递归函数声明:

TreeNode* buildTree(vector& inorder, vector& postorder);

递归出口:

(1) 当inorder为空,postorder为空,返回空

if(inorder.size()==0&&postorder.size()==0)return NULL;

 (2)当inorder和postorder中只有一个元素时,返回该元素构造的根节点

if(inorder.size()==1&&postorder.size()==1)
{
  TreeNode *root=new TreeNode(inorder[0]);
  return root; 
}

递归体:

(1)后序遍历序列的最后一个元素构造二叉树根节点

(2)在中序遍历序列中找到这个根节点

        用中序序列中根节点的左部分元素递归构造二叉树的左子树

        用中序序列中根节点的右部分元素递归构造二叉树的右子树

(3)构造出整个树

完整代码:

class Solution {
public:
    TreeNode* buildTree(vector& inorder, vector& postorder) {


if(inorder.size()==0&&postorder.size()==0)return NULL;
if(inorder.size()==1&&postorder.size()==1)
{
  TreeNode *root=new TreeNode(inorder[0]);
  return root; 
}


TreeNode *root=new TreeNode(postorder[postorder.size()-1]);

//找到根节点在中序遍历序列的索引,就可以知道左子树的节点个数,右子树节点个数
int index=find(inorder.begin(),inorder.end(),postorder[postorder.size()-1])-inorder.begin();//index是根节点所在索引

vectorinorder_left(inorder.begin(),inorder.begin()+index);
vectorinorder_right(inorder.begin()+index+1,inorder.end());

vectorpostorder_left(postorder.begin(),postorder.begin()+index);
vectorpostorder_right(postorder.begin()+index,postorder.end()-1);

TreeNode *l=buildTree(inorder_left,postorder_left);
TreeNode *r=buildTree(inorder_right,postorder_right);

root->left=l;
root->right=r;

return root;    }
};
105先序和中序构造二叉树

思路相同

代码

class Solution {
public:
    TreeNode* buildTree(vector& preorder, vector& inorder) {
if(inorder.size()==0&&preorder.size()==0)return NULL;
if(inorder.size()==1&&preorder.size()==1)
{
  TreeNode *root=new TreeNode(inorder[0]);
  return root; 
}


TreeNode *root=new TreeNode(preorder[0]);

//找到根节点在中序遍历序列的索引,就可以知道左子树的节点个数,右子树节点个数
int index=find(inorder.begin(),inorder.end(),preorder[0])-inorder.begin();//index是根节点所在索引

vectorinorder_left(inorder.begin(),inorder.begin()+index);
vectorinorder_right(inorder.begin()+index+1,inorder.end());

vectorpreorder_left(preorder.begin()+1,preorder.begin()+index+1);
vectorpreorder_right(preorder.begin()+index+1,preorder.end());

TreeNode *l=buildTree(preorder_left,inorder_left);
TreeNode *r=buildTree(preorder_right,inorder_right);

root->left=l;
root->right=r;

return root;  
    }
};

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/512982.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号