Java数据结构二叉树练习

1.检查两棵二叉树是否都是相同的练习

我要求时间复杂度为1,所以我们不用前序中序后序是否都一样来进行判断

如何判断二叉树是否都是相同的子问题方式

先判断根节点是否相同

再判断左子树和右子树是否都是相同的

先用代码判断不相同的情况,都相同的化那么就可以直接输出true了 

图总结三种来判断二叉树是否是相同的

代码实现

第二种写法是最好的看你喜欢哪个 

. - 力扣(LeetCode)练习网址

2.反转二叉树练习

. - 力扣(LeetCode)//题目链接

其中这个问题的思路就是将第根节点的下面两个的第一个的叶子节点进行反转(简单思路)

图解

定义一个节点类型的tmp,用tmp的左右节点来进行节点的交换,然后遍历整个数组。

3.判断两个二叉树是否是平衡二叉树(AVL树我会在高阶数据结构中进行讲解)(难度高)

在做这个题之前把二叉树前面的内容复习一下包括练习、

. - 力扣(LeetCode)

 

图解 

代码实现

先用我们之前写的方法来算出二叉树的高度,然后题目的要求是:每个子树和根(虚拟为跟更好的可以理解) 的深度相减的绝对值要小于2,所以我们遍历整个二叉树,在if语句中要遍历两次一次是左边,一次是右边,这时候就可以将二叉树的所有节点进行判断是否是满足条件的。如果满足条件的话那么就输出true

代码逻辑图 复杂度是n^2.

 我们要定义的代码的复杂度要求是n,所以我们重新写一下这段代码

class Solution {
    public boolean isBalanced(BinaryTree.TreeNode root) {
        if (root == null) {
            return true;
        }
     return getHeight(root) >= 0;
    }

    private int getHeight(BinaryTree.TreeNode root) {
        if (root == null) {
            return 0;
        }
        int leftHeight = getHeight(root.left);
        int rightHeight = getHeight(root.right);
        if (Math.abs(leftHeight - rightHeight) <= 1 && leftHeight >= 0 && rightHeight >=0) {
            return Math.max(leftHeight,rightHeight) +1;//计算出高度
        }else{
            return -1;
        }
    }
}

4.判断这个二叉树是否是平衡二叉树

root是否对称要看root的左树和右树是否对称(左树的左和右树的右来进行对比)

遍历左树和右树是否一样再判断根节点是否是一样的。(前序遍历)

 5.二叉树的遍历

二叉树遍历_牛客题霸_牛客网

定义一个i然后一边遍历一边进行创建,用前序遍历来递归创建这个二叉树。 

前序遍历根左右。

大致框架

接下来就是要写TreeNode这个方法 (1.56.04)

最后就完成了这个方法

虽然我们写完了这个方法,但是要注意public static int i这个成员,所以我们要是有两个测试用例在执行第二个测试用例的时候,会报错

报错的原因是,越界,静态成员变量在执行每一组测试用例的时候都会实例化对象,但是在方法中静态成员变量只有一个,他是不属于这个对象的,只有一份,所以更新以后就会越界

所以我不建议用静态成员变量

6.二叉树的分层遍历(三个题讲解)

6.1层序遍历(非递归方式)

用队列的方式进行遍历

A先把左边带进来再把右边带进来 

这时候队列中就有了BC ,A是出去了

这时候再把b的左右带入

以此类推

代码实现

在这段代码中我们会示例化一个列表其中,这个列表会将元素插入到列表的最后面

知识的复习

Java.util.LinkedList.offer () 方法 描述 java.util.LinkedList.offer (E e) 方法将指定元素添加为该列表的尾部(最后一个元素)

Java.util.LinkedList.pop () 方法 描述 java.util.LinkedList.pop () 方法从这个列表表示的堆栈中弹出一个元素。 弹出意味着移除并返回这个列表的第一个元素。

软件包java.util.LinkedList.poll ()中提供了此方法。 This method is used to retrieves the first or initial or beginning element of the linked list and removes the first element from the list. 此方法用于检索链表的第一个或初始或开始元素,并从列表中删除第一个元素。

其中while循环的条件是,这个列表不为空,然后每次循环都会将列表的头头弹出并且用cur记录下来,然后遍历这个弹出节点的左右节点并且放入队列当中,然后再循环,发现队列不为空,这时候再弹出队列第一个元素,然后用cur记录下来然后遍历左右节点然后放入队列当中。依次循环遍历

 isEmpty方法是判断这个队列是否为空,这里我没写所以会报错后序工程文件会进行补充

其中再力扣中是把每一层放到一起,我们只需要区蒙一下他是在哪一层

 6.2判断一个二叉树是不是完全二叉树

(1)先判断根节点是不是为空,并且放入这个队列中,定义一个节点cur,如果队列不为空就会弹出这个节点然后遍历它的左右节点,没有数据把null放进来有也正常放出来,

(2)其中完全二叉树中,在遍历完整个二叉树以后,队列中全部都是null

(3)在不是完全二叉树的二叉树中,在遍历完整个二叉树以后,队列种不全是null还会有节点val值

代码实现 

 6.3给定一个二叉树找到二叉树的最近公共祖先

. - 力扣(LeetCode)题目

(1)第一种实现方式

 图解其中有三种情况

 代码实现

(2)第二种实现方式

p和q都往上走,相交的就是公共节点(用栈存储这个数据
 

 代码实现(查找路径代码)

6.4通过前序遍历,中序遍历确定一个二叉树

6.5通过后序遍历中序遍历确定一个二叉树

  • 15
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Frank1-0-2-4

我会继续努力的,十分感谢谢谢你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值