Java~二叉树进阶练习题:根据先序遍历和中序遍历构建二叉树 与 根据后序遍历和中序遍历构建二叉树

  • 先序遍历中 第一个一定是根结点。

  • 中序遍历中 根结点左子树的所有结点一定在根结点的左边,右子树的所有结点一定在根结点的右边。所有中序遍历的序列组成可以表示为 :左子树结点+根结点+右子树结点。

  • 后序遍历中 最后一个结点一定是根结点。**

**根据先序遍历和中序遍历构建二叉树

解题细想:**

  1. 设置变量inedx 方便从preorder数组中获取元素构建结点。

  2. 判断inedx的合法性,防止我们在最终的递归途中数组越界异常。

  3. 中序遍历中根结点可以作为一道分界线,他的左边是他的左子树结点,右边是右子树结点,所以一开始的nodeLeft 为0 nodeRight为中序遍历数组的长度。

  4. 根结点就是先序遍历的第一个结点,构建根结点,然后 index++(方法中index只加一次是因为在preorder数组中index下标的元素只可能是左结点或者右结点)。

  5. 构建根结点的左结点,(在此之前我们要在中序遍历中找到根结点元素的下标pos),我们知道 中序遍历的序列组成可以表示为 :左子树结点+根结点+右子树结点 所以,根结点的左结点一定在pos之前。

  6. 然后我们进行递归进行判断nodeLeft 和nodeRight(就是上一个方法传来的pos值)的合法性,只要nodeLeft不是大于等于nodeRight 就说明在根结点下标的左边有元素,也就是说根结点的左子树不为空。构建该结点然后再次进行递归判断。

  7. 直到根结点的左子树的根结点建立完,此时就要建立根节点的子树、

  8. 此时传入的nodeLeft为pos+1和一开始的nodeRight,然后进行递归处理,只要 nodeLeft不是大于等于nodeRight 就说明在根结点下标的右边有元素,也就是说明有右子树,构建它。

代码如下:

//根据一棵树的前序遍历与中序遍历构造二叉树。

class Solution {

private int index = 0;

public TreeNode buildTree(int[] preorder, int[] inorder) {

index = 0;

return myBuildTree(preorder, inorder, 0, preorder.length);

}

public TreeNode myBuildTree(int[] preorder, int[] inorder, int indexLeft, int indexRight) {

if(indexLeft >= indexRight) {

return null;

}

if(index >= inorder.length) {

return null;

}

TreeNode node = new TreeNode(preorder[index]);

index ++;

int pos = findNodePos(inorder, node.val);

node.left = myBuildTree(preorder, inorder, indexLeft, pos);

node.right = myBuildTree(preorder, inorder, pos + 1, indexRight);

return node;

}

private int findNodePos(int[] inorder, int val) {

for (int i = 0; i < inorder.length; i++) {

if(inorder[i] == val) {

return i;

}

}

return -1;

}

}

**根据后序遍历和中序遍历构建二叉树:

解题思想:**

  1. 只要把上面的题回了,这道题很简单的。

  2. 首先后序遍历的最后一个结点是根结点,所以一开始index=数组的长度-1.

  3. 上面那道题是先建立左子树,再建立右子树,而这道题是后序遍历,所以要先建立右子树,再建立左子树。

  4. 其他递归条件和上一道题一样。

class Solution {

private int index = 0;

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618164986)

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 25
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值