标签:遍历 TreeNode int 中序 postr inl postl 二叉树 post
算法思想
后序遍历序列的最后一个节点是根节点,而中序遍历的根节点左侧都是左子树的节点,右侧都是右子树的节点,根据这种特点,我们可以从后序遍历中找到根节点,再在中序遍历中找到根节点,然后递归的对中序遍历的左子树及右子树进行建树;
代码
struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; TreeNode *build(vector<int>& in, vector<int>& post,int postl,int postr,int inl,int inr){ if(inl>inr||postl>postr)return NULL;//如果左边界大于右边界则返回 TreeNode *x=new TreeNode(post[postr]);//新建一个节点 int k=inl;//开始搜索根节点 while(in[k]!=post[postr])k++;//k指向中序遍历的根节点,其左边是左子树的中序序列,右边是右子树的中序序列 x->left=build(in,post,postl,postl+k-inl-1,inl,k-1);//递归的对左子树建树 x->right=build(in,post,postl+k-inl,postr-1,k+1,inr);//递归的对右子树建树 return x;//返回根节点 } TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) { return build(inorder,postorder,0,inorder.size()-1,0,postorder.size()-1) }
type TreeNode struct { Val int Left *TreeNode Right *TreeNode } func build(in ,post []int,inl ,inr ,postl ,postr int)*TreeNode{ if inl>inr||postl>postr { return nil } root:= &TreeNode{Val:post[postr]} k := inl for in[k]!=post[postr]{ k++ } root.Left=build(in,post,inl,k-1,postl,postl+k-inl-1) root.Right=build(in,post,k+1,inr,postl+k-inl,postr-1) return root } func buildTree(inorder []int, postorder []int) *TreeNode { return build(inorder,postorder,0,len(inorder)-1,0,len(postorder)) }golang
标签:遍历,TreeNode,int,中序,postr,inl,postl,二叉树,post 来源: https://www.cnblogs.com/tao10203/p/13728406.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。