二叉树(练习题二)

日升时奋斗,日落时自省

目录

一、二叉树练习

习题六

 习题七

 习题八

一、二叉树练习

习题六

102. 二叉树的层序遍历 - 力扣(LeetCode)

条件解析:

(1)题中给的是List的嵌套,List集合接口实例化创建

(2)首先判空

(3)队列解决问题,将一层一层队入(图解

(4)入队一层后,定义一个临时变量cur,出队找左子树和右子树

(5)队列不空,依次重复操作(循环)

public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> list=new ArrayList<>();       //需要的嵌套List
        if(root==null){                 //首先是判空
            return list;            
        }
        Queue<TreeNode> qu=new LinkedList<>();            //创建一个队列
        qu.offer(root);                                   //整个树的根节点
        while(!qu.isEmpty()){                             //循环,队列不为空
            int size= qu.size();;                         //计算每层的个数
            List<Integer> tmp=new ArrayList<>();          //创建一个List,存放嵌套值
            while(size>0){                                //每层的循环
                TreeNode cur=qu.poll();                   //一个临时变量来接受队列的队头,同时接收左子树和右子树
                tmp.add(cur.val);                         //每层循环都将当前根节点放入List
                if(cur.left!=null){                       //左树不为空存放
                    qu.offer(cur.left);
                }
                if(cur.right!=null){                     //右树不为空存放
                    qu.offer(cur.right);
                }
                size--;                                 //循环结束条件别忘
            }
            list.add(tmp);                              //外层嵌套录入
        }
        return list;
    }

 图解:

 

 习题七

236. 二叉树的最近公共祖先 - 力扣(LeetCode)

条件解释:

(1)最近的公共祖先,就是两个节点的在该最小子树的根节点

(2)判断空树

(3)找两个节点的位置,判断是否找到其中一个

(4)遍历

(5)遍历后两个都找到了,返回

(6)遍历后找到左子树其中一个,返回当前节点,在右子树找

(7)遍历后找到右子树中的一个,返回当前节点

public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root==null){                                    //判空
            return null;
        }
        if(q==root||p==root){                               //找到的情况下就是找到其中一个
            return root;                                   //返回当前值
        }
        TreeNode leftside=lowestCommonAncestor(root.left,p,q);  //左子树遍历
        TreeNode rightside=lowestCommonAncestor(root.right,p,q);  //右子树遍历
        if(leftside!=null&&rightside!=null){                 //如果两个都找到了就自然返回当根节点
            return root;
        }else if(leftside!=null){                           //找到某个节点以后返回到当前根节点
            return leftside;
        }else if(rightside!=null){                        //作用与上面相同
            return  rightside;
        }else {
            return null;                                      //没有找到的情况下返空
        }
    }

图解:

三种情况

 习题八

二叉搜索树与双向链表_牛客题霸_牛客网 (nowcoder.com)

条件解释:

(1)首先就是想到中序遍历解决问题(就题论题)

(2)成为双向链表之前需要一个节点来往回连接

(3)每递归回去一次就连接一次

public TreeNode Convert(TreeNode pRootOfTree) {    //中序遍历转链表
        if(pRootOfTree==null){
            return null;
        }
        CovertChildren(pRootOfTree);
        TreeNode head=pRootOfTree;
        while(head.left!=null){            //从根节点到最左边,返回出链表头
            head=head.left;
        }
        return head;

    }
    public void CovertChildren(TreeNode root){  //模仿中序遍历
        if(root==null){
            return ;
        }
        CovertChildren(root.left);
        root.left=prev;              //像来双向链表一样衔接
        if(pre!=null){
            prev=root;
        }
        prev=root;
        CovertChildren(root.right);
    }

图解:(蓝色为递归回退) 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值