首页 > 其他分享 >根据前序遍历和中序遍历重建二叉树

根据前序遍历和中序遍历重建二叉树

时间:2023-04-17 13:55:53浏览次数:51  
标签:preOrder 遍历 TreeNode int 前序 二叉树 inOrder public

LeetCode 105.

给定两个整数数组preOrder 和inOrder,其中preOrder是二叉树的先序遍历,inOrder是二叉树的中序遍历,请构造二叉树并返回其根节点

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left;
 *     public TreeNode right;
 *     public TreeNode(int val=0, TreeNode left=null, TreeNode right=null) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
public class Solution {
    Dictionary<int, int> inOrderMap = new Dictionary<int, int>();

    public TreeNode BuildTree(int[] preOrder, int[] inOrder) {
        for (int i = 0; i < inOrder.Length; i++)
            inOrderMap.Add(inOrder[i], i);

        return BuildTreeByRecursion(preOrder, 0, preOrder.Length - 1, inOrder, 0, inOrder.Length - 1);
    }

    public TreeNode BuildTreeByRecursion(int[] preOrder, int preStart, int preEnd, int[] inOrder, int inStart, int inEnd)
    {
//先序遍历的第一个节点一定是当前子树的根节点 int rootValue = preOrder[preStart]; int rootInOrderIndex = inOrderMap[rootValue]; TreeNode root = new TreeNode(rootValue);
     //当前子树左孩子节点数 int leftNodes = rootInOrderIndex - inStart;
     //当前子树右孩子节点数
     int rightNodes = inEnd - rootInOrderIndex; if (leftNodes > 0) root.left = BuildTreeByRecursion(preOrder, preStart + 1, preStart + leftNodes, inOrder, inStart, rootInOrderIndex - 1); if (rightNodes > 0) root.right = BuildTreeByRecursion(preOrder, preStart + leftNodes + 1, preEnd, inOrder, rootInOrderIndex + 1, inEnd); return root; } }

 

标签:preOrder,遍历,TreeNode,int,前序,二叉树,inOrder,public
From: https://www.cnblogs.com/ayang1/p/17325619.html

相关文章

  • Uva--679 Dropping Balls(二叉树的编号)
    记录23:282023-4-16https://onlinejudge.org/external/6/679.pdfreference:《算法竞赛入门经典第二版》例题6-6二叉树,这里是完全二叉树,使用模拟的方式应该会TLE(虽然我用模拟的方式也TLE了,但不是这个原因,下面会提到原因)不用模拟的方式,转换思路,使用递归的方式去思考。这里......
  • 平衡二叉树——C语言描述——创建,增加结点
    平衡二叉树——C语言描述——创建,增加结点目录平衡二叉树——C语言描述——创建,增加结点0测试用例框架1定义2数据结构2增加平衡二叉树的结点(1)代码(2)测试用例0测试用例框架https://blog.csdn.net/m0_59469991/article/details/127137119?csdn_share_tail=%7B%22type%22%3A%2......
  • 数据结构-->二叉树 OJ_01
    经过前几期浴血奋战!!二叉树便要进入应用阶段了!今天,为大家带来几道OJ题的讲解!1.单值二叉树如果二叉树每个结点都具有相同的值,那么该二叉树就是单值二叉树只有给定的树是单值二叉树时,才会返回true,否则返回false下面为了方便理解,进行图解举例:>有上述的两种情况,其中还需要考虑到......
  • 算法-二叉树的构造
    namespaceBinary;publicclassBinaryTree{publicNode<char>Head{get;privateset;}privatestringcStr{get;set;}publicBinaryTree(stringconstructStr){this.cStr=constructStr;th......
  • 遍历加if条件选择
    一共有5个村民,编号分别为A、B、C、D、E,他们其中一个在村口看到过锦鲤。5个村民各自发言:    A:我和E都没有看到过锦鲤    B:锦鲤是被C和E其中一个看到的    C:锦鲤是被我和D其中一个看到的    D:B和C都没有看到过锦鲤    E:我没有看到锦鲤已......
  • 二叉树遍历算法分析
    二叉树遍历算法分析前/中/后序遍历算法可以发现这三种遍历算法只有一行代码,也就是输出结点数据域的位置不同前序遍历是先输出数据域再递归到左孩子和右孩子中序遍历是先递归到左孩子等返回的时候输出数据域再递归到右孩子后序遍历是指先递归到左孩子,然后递归到右孩子,最后......
  • 数据结构-->二叉树_02
    今天,接着上一期的博文,继续推进!!请看下面的的代码:>求一棵树的高度,为何需要存储起来呢?解答这个问题之前,需要稍微改动一下,上述的代码!会发现上述代码有很大的好处!//二叉树的高度intTreeHight(BTNode*root){ if(root==NULL){ return0;}returnTreeHight(root->l......
  • 二叉树的创建和中序及后序遍历
    二叉树的创建和中序及后序遍历二叉的先序创建使用#号来表示该结点为null实现代码先进行先序创建然后进行先序遍历#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<vector>#include<cstring>#include<unordered_set>#includ......
  • 【数据结构】二叉树的基本操作与遍历(C语言)
     目录定义满二叉树 完全二叉树性质应用计算二叉树结点个数 计算叶子结点的个数第 k层结点的个数查找值为x的节点遍历前序遍历中序遍历后序遍历层序遍历判断是否为完全二叉树定义......
  • 关于js对象遍历保证顺序的问题
    Object.keys(obj).sort().forEach(...),注:仅用于对象的key值是可定义顺序的,如key值为时间错,数字等,通过sort(),可默认按照数组大小排序(也可通过sort的自定义函数排序)object.keys/values()和forin不能保证对象传成数组或遍历的顺序友情链接1友情链接2......