🍏 4.某二叉树的后序遍历序列与中序遍历序列相同,均为 ABCDEF ,则按层次输出(同一层从左到右)的序列为(A)
A: FEDCBA B: CBAFED C: DEFCBA D: ABCDEF
🍤🍤解答:我们先来回顾一下后序和中序的遍历方式;后序:左右根 中序:左根右 由题意得知后序与中序的遍历结果相同,那么我们发现舍去右孩子,二者的遍历方式都是左根,也就是说该二叉树是没有右孩子的一颗二叉树。画出效果图如下:
🍼🍼重要结论:只给出二叉树的前序和后序的结果,是无法推导出该课二叉树的模型的,也就是三种遍历方式,想要通过其中两种得到第三种的结果,则这两种方式中必须存在中序遍历!
二、二叉树的基本操作
接下来博主将通过idea来演示二叉树的基本操作。
我们下面的基本操作都是基于这个二叉树来完成的!
1、首先我们新建一个包名为BinaryTree,在这个包下新建两个类Test 和 TestBinaryTree。
2、我们初始化实现一个内部类:
public class TreeNode {
char val;
TreeNode left;
TreeNode right;
TreeNode() {
}
TreeNode(char val) {
this.val = val;
}
TreeNode(char val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
public TreeNode createTree() {//创建二叉树
TreeNode A = new TreeNode('A');
TreeNode B = new TreeNode('B');
TreeNode C = new TreeNode('C');
TreeNode D = new TreeNode('D');
TreeNode E = new TreeNode('E');
TreeNode F = new TreeNode('F');
TreeNode G = new TreeNode('G');
TreeNode H = new TreeNode('H');
A.left = B;
A.right = C;
B.left = D;
B.right = E;
C.left = F;
C.right = G;
E.right = H;
return A;
}
3、三种遍历方式的实现
public void preOrder(TreeNode root){//前序遍历
if(root == null){
return;
}
System.out.print(root.val+" ");
preOrder(root.left);
preOrder(root.right);
}
public void inOrder(TreeNode root){//中序遍历
if(root == null){
return;
}
preOrder(root.left);
System.out.print(root.val+" ");
inOrder(root.right);
}
public void postOrder(TreeNode root){//后序遍历
if(root == null){
return;
}
preOrder(root.left);
inOrder(root.right);
System.out.print(root.val+" ");
}
运行结果:
4、获取树中节点的个数(2种方法)
// 获取树中节点的个数 两种方法
public static int nodeSize = 0;
public int size(TreeNode root) {
if(root == null) {
return 0;
}
nodeSize++;
size(root.left);
size(root.right);
return nodeSize;
}
public int size2(TreeNode root) {
if(root == null) {
return 0;
}
int tmp = size2(root.left)+size2(root.right)+1;
return tmp;
}
运行结果:
5、获取叶子节点的个数(两种方法)
int getLeafNodeCount(TreeNode root) {
if(root == null) {
return 0;
}
if(root.left == null && root.right == null) {
return 1;
}
int tmp = getLeafNodeCount(root.left) +
getLeafNodeCount(root.right);
return tmp;
}
public static int leafSize = 0;
void getLeafNodeCount2(TreeNode root) {
if(root == null) {
return ;
}
if(root.left == null && root.right == null) {
leafSize++;
}
getLeafNodeCount2(root.left);
getLeafNodeCount2(root.right);
}
运行结果:
6、判断第K层节点的个数
int getKLevelNodeCount(TreeNode root,int k) {
if(root == null || k <= 0) {
return 0;
}
if(k == 1) {
return 1;
}
int tmp = getKLevelNodeCount(root.left,k-1) +
getKLevelNodeCount(root.right,k-1);
return tmp;
}
运行结果:(这里我们求的是第3层的结果)
7、获取二叉树的高度
// 时间复杂度:O(n)
public int getHeight(TreeNode root) {
if(root == null) {
return 0;
}
int leftHeight = getHeight(root.left);
int rightHeight = getHeight(root.right);
return leftHeight > rightHeight ? leftHeight+1 : rightHeight+1;
}
// 时间复杂度:O(n)
public int getHeight2(TreeNode root) {
if(root == null) {
return 0;
![img](https://img-blog.csdnimg.cn/img_convert/9de2fbaf3d945e3a15cef21a0d99e8c8.png)
![img](https://img-blog.csdnimg.cn/img_convert/248d3514d35388ab93dd6ec7b8b68a73.png)
![img](https://img-blog.csdnimg.cn/img_convert/bc08831cc138369f578bf2dccbef9285.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**
mg-8tqumazv-1714456228211)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**