首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

需要从inOrder和preOrder返回postOrder树

从inOrder和preOrder返回postOrder树的问题,可以通过递归的方式来解决。首先,我们需要了解inOrder、preOrder和postOrder这三种遍历方式的含义。

  • inOrder遍历:先遍历左子树,然后访问根节点,最后遍历右子树。
  • preOrder遍历:先访问根节点,然后遍历左子树,最后遍历右子树。
  • postOrder遍历:先遍历左子树,然后遍历右子树,最后访问根节点。

根据这三种遍历方式的特点,我们可以利用preOrder遍历的结果确定根节点,然后根据根节点在inOrder遍历中的位置,将inOrder遍历划分为左子树和右子树的部分。接下来,我们可以递归地对左子树和右子树进行同样的操作,直到遍历完所有节点。

下面是一个示例代码,用于从inOrder和preOrder返回postOrder树:

代码语言:txt
复制
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def buildTree(inOrder, preOrder):
    if not inOrder or not preOrder:
        return None

    # 根据preOrder确定根节点
    root_val = preOrder[0]
    root = TreeNode(root_val)

    # 在inOrder中找到根节点的位置
    root_index = inOrder.index(root_val)

    # 划分左子树和右子树的inOrder和preOrder
    left_inOrder = inOrder[:root_index]
    right_inOrder = inOrder[root_index+1:]
    left_preOrder = preOrder[1:root_index+1]
    right_preOrder = preOrder[root_index+1:]

    # 递归构建左子树和右子树
    root.left = buildTree(left_inOrder, left_preOrder)
    root.right = buildTree(right_inOrder, right_preOrder)

    return root

def postOrderTraversal(root):
    if not root:
        return []

    result = []
    result.extend(postOrderTraversal(root.left))
    result.extend(postOrderTraversal(root.right))
    result.append(root.val)

    return result

# 测试代码
inOrder = [9, 3, 15, 20, 7]
preOrder = [3, 9, 20, 15, 7]
root = buildTree(inOrder, preOrder)
postOrder = postOrderTraversal(root)
print(postOrder)

这段代码首先定义了一个TreeNode类,用于表示树的节点。然后,通过buildTree函数构建树,该函数接受inOrder和preOrder两个列表作为参数,并返回根节点。最后,通过postOrderTraversal函数对构建好的树进行postOrder遍历,返回postOrder遍历结果。

这个问题中没有要求提及腾讯云相关产品,因此不需要提供相关链接。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

LeetCode——遍历序列构造二叉

105从前序与中序遍历序列构造二叉 给定两个整数数组 preorder inorder ,其中 preorder 是二叉的先序遍历, inorder 是同一棵的中序遍历,请构造二叉返回其根节点...preorder.length -3000 <= preorder[i], inorder[i] <= 3000 preorder inorder 均无重复元素 inorder 均出现在 preorder...因为第一个数组是前序遍历,所以进入左子树的递归之后就能先查到左子树的第一个根,也就是9,然后去查看他的左子树右子树发现都是空,所以就直接返回,也确定了3的的左子树的结构,然后返回到3,再进入3的右子树...106从中序与后序遍历序列构造二叉 给定两个整数数组 inorder postorder ,其中 inorder 是二叉的中序遍历, postorder 是同一棵的后序遍历,请你构造并返回这颗二叉...inorder.length -3000 <= inorder[i], postorder[i] <= 3000 inorder postorder 都由不同的值组成 postorder 中每一个值都在

23120
  • 构建二叉

    从中序与后序构建二叉 给定两个整数数组 inorder postorder ,其中 inorder 是二叉的中序遍历, postorder 是同一棵的后序遍历,请你构造并返回这颗 二叉 。...不为空则向下继续,为空返回null 去后序数组中的最后一个元素为的头节点的val值,(原因由后序遍历可知) 切割中序数组 ,以头节点的val值为区分(作为切割点) ,切割成中序左数组 中序右数组...if (inBegin >= inEnd || postBegin >= postEnd) { // 不满足左闭右开,说明没有元素,返回 return null...} } 从前序与中序构建二叉 思路 与从中序后序构建二叉相同 代码实现 class Solution { Map map; // 方便根据数值查找位置...// 参数里的范围都是前闭后开 if (inBegin >= inEnd || postBegin >= postEnd) { // 不满足左闭右开,说明没有元素,返回

    6410

    算法:分治

    给定两个整数数组 inorder postorder ,其中 inorder 是二叉的中序遍历, postorder 是同一棵的后序遍历,请你构造并返回这颗 二叉 。...-3000 <= inorder[i], postorder[i] <= 3000 inorder postorder 都由 不同 的值组成 postorder 中每一个值都在 inorder 中...inorder 保证是的中序遍历 postorder 保证是的后序遍历 解题思路: 中序遍历的顺序:先左子树->根节点->右子树 后序遍历的顺序:先左子树->右子树->根节点 基于后续遍历可以知道...给定两个整数数组 preorder inorder ,其中 preorder 是二叉的先序遍历, inorder 是同一棵的中序遍历,请构造二叉返回其根节点。...保证 为二叉的前序遍历序列 inorder 保证 为二叉的中序遍历序列 解题思路: 与之前的中序遍历后续遍历一样,先找到根节点,然后将其分为左子树右子树,分治递归的构建左子树右子树 前序遍历的顺序

    1K30

    二叉:构造二叉登场!

    例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序遍历 postorder = [9,15,7,20,3] 返回如下的二叉: ?...例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉: ? 思路 本题106是一样的道理。...return traversal(inorder, 0, inorder.size(), preorder, 0, preorder.size()); } }; 思考题 前序中序可以唯一确定一颗二叉...那么tree1 tree2 的前序后序完全相同,这是一棵么,很明显是两棵! 所以前序后序不能唯一确定一颗二叉!...最后我还给出了为什么前序中序可以唯一确定一颗二叉,后序中序可以唯一确定一颗二叉,而前序后序却不行。 认真研究完本篇,相信大家对二叉的构造会清晰很多。

    80840

    东哥手把手帮你刷通二叉|第二期

    通过前序中序遍历结果构造二叉 经典问题了,面试/笔试中常考,力扣第 105 题就是这个问题: 函数签名如下: TreeNode buildTree(int[] preorder, int[] inorder...root.val); traverse(root.right); } 前文 二叉就那几个框架 写过,这样的遍历顺序差异,导致了preorderinorder数组中的元素分布有如下特点:.....preEnd], 后续遍历数组为 postorder[postStart..postEnd], 构造二叉返回该二叉的根节点 */ TreeNode build(int[] preorder...通过后序中序遍历结果构造二叉 类似上一题,这次我们利用后序中序遍历的结果数组来还原二叉,这是力扣第 106 题: 函数签名如下: TreeNode buildTree(int[] inorder...inorder数组中的元素分布有如下特点: 这道题上一题的关键区别是,后序遍历前序遍历相反,根节点对应的值为postorder的最后一个元素。

    22220

    给出前序遍历中序遍历求二叉_已知前序遍历后序遍历

    (确定二叉父子结点),就可以确定一棵唯一的二叉 三、C++代码实现 1.已知先序遍历中序遍历,打印后序遍历(见函数void postorder(string preorder, string inorder...)); 2.已知中序遍历后序遍历,打印先序遍历(见函数void preorder(string inorder, string postorder)); #include #include...(preorder[0]) or pos = inorder.find(postorder[postorder.size()-1]) 先序遍历(NLR), 根节点编号(0), 左子树编号(1~pos)...,pos从0开始,所以len-pos-1 cout<<preorder[0]; //最后输出根节点 } void preorder(string inorder, string postorder...); // 类似于先序遍历过程 cout<<postorder[len-1]; preorder(inorder.substr(0, pos), postorder.substr(0,

    58620

    根据后序中序遍历输出先序遍历

    输入格式: 第一行给出正整数N(≤30),是中结点的个数。随后两行,每行给出N个整数,分别对应后序遍历中序遍历结果,数字间以空格分隔。题目保证输入正确对应一棵二叉。...输出格式: 在一行中输出Preorder:以及该的先序遍历结果。数字间有1个空格,行末不得有多余空格。...2.中序遍历的递归过程为:若二叉为空,遍历结束。否则:①中序遍历根结点的左子树;②访问根结点;③中序遍历根结点的右子树。简单来说中序遍历就是从左子树返回时遇到结点就访问。...3.后序遍历的递归过程为:若二叉为空,遍历结束。否则:①后序遍历根结点的左子树;②后序遍历根结点的右子树;③访问根结点。简单来说后序遍历就是从右子树返回时遇到结点就访问。...++) { cin >> inorder[i]; //输入中序 } cout << "Preorder:"; getpre(postorder,inorder

    94610

    算法与数据结构之二叉的遍历

    二叉的遍历方式 前序遍历(Preorder) 前序遍历就是先访问根节点,再访问左子节点,最后访问右子节点的遍历方式 中序遍历(Inorder) 中序遍历是先访问左子节点,再访问根节点,最后访问右子节点的遍历方式...后序遍历(Postorder) 后序遍历是先访问左子节点,再访问右子节点,最后访问根节点的遍历方式 二叉的遍历 二叉的遍历可以通过递归来实现。...递归终止的条件是当前节点为空节点,然后返回。前中后序遍历的递归函数不同之处只是输出当前节点的那条语句不同。 题目 假设二叉有n个节点,编号分别为0至n-1。..."<<endl; preorder(root); cout<<endl<<"Inorder"<<endl; inorder(root); cout<<endl<<"Postorder..."<<endl; Postorder(root); cout<<endl; } 注意事项 二叉的遍历会对每一个节点进行访问,因此时间复杂度为O(n)。

    21830
    领券