zoukankan      html  css  js  c++  java
  • 牛客_剑指offer题集——树的子结构(java实现)

    题目链接:

    https://www.nowcoder.com/practice/6e196c44c7004d15b1610b9afca8bd88?tpId=13&tqId=11170&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

    思路:先通过层次遍历将a树中和b树根节点相同值的结点全部存入缓存数组,然后遍历缓存数组,通过判断二树结构是否相同的递归方法,来返回值

    需要注意的点:在递归函数中,不能判断到A树的空值就返回,必须先改一下标记,否则很可能b树此处不为空而a树为空导致错误判断

    代码实现:

    package niuke;
    
    public class 树的子结构 {
        public boolean HasSubtree(TreeNode root1,TreeNode root2) {
            if(root1==null||root2==null) return false;
            /**
             * 使用层次遍历找出大一些的树中第二颗子树的根节点
             */
            TreeNode[] queue = new TreeNode[1000];
            int front = 0;
            int rear = 0;
            rear = (rear+1)%1000;
            TreeNode tn = root1;
            queue[rear] = tn;
            TreeNode[] buffer = new TreeNode[1000];
            int index = 0;
            while(front!=rear){
                front = (front+1)%1000;
                tn = queue[front];
                if(tn.val==root2.val){
                    buffer[index] = tn;
                    index++;
                }
                if(tn.left!=null) {
                    rear = (rear + 1) % 1000;
                    queue[rear] = tn.left;
                }
                if(tn.right!=null) {
                    rear = (rear + 1) % 1000;
                    queue[rear] = tn.right;
                }
            }
            boolean flag_in = false;
            for(TreeNode each :buffer){
                flag = true;
                if(each==null) break;
                inOrderTraversal(each,root2);
                if(flag){
                    flag_in = true;
                    break;
                }
            }
            return flag_in;
        }
    
        private boolean flag = true;
    
        private void inOrderTraversal(TreeNode root1,TreeNode root2){
            if(root2==null)return;
            if(root1==null||root1.val!=root2.val){
                flag = false;
                return;
            }
            inOrderTraversal( root1.left, root2.left);
            inOrderTraversal( root1.right, root2.right);
        }
    
    
    
    }

    代码已经ac

    希望对大家有所帮助

    以上

  • 相关阅读:
    Understand 学习
    2021年1月
    查看所有请求
    DB2日期和时间函数汇总
    .getClass和.class
    继承和实现接口的区别
    java8 stream
    Lambda表达式详解
    SQL语句小知识---XML文件中的 CDATA语法
    Java--mapper.xml中常用SQL标签
  • 原文地址:https://www.cnblogs.com/lavender-pansy/p/12437033.html
Copyright © 2011-2022 走看看