二叉树--算法题总结

1、利用层序遍历的产生的字符串来创建二叉树

复制代码
 /**
     * 使用层序遍历的字符串创建二叉树
     * @param treeInfo
     * @return
     */
    public static TreeNode generateTreeNodeSecond(String treeInfo) {
        LinkedList<TreeNode> treeNodeLinkedList = new LinkedList<>();
        if(StringUtils.isEmpty(treeInfo)) {
             return null;
        }
        String[] stringList = treeInfo.split(",");
        int i =0;
        TreeNode root = new TreeNode(Integer.valueOf(stringList[i]));
        treeNodeLinkedList.offer(root);
        i++;
        while(!treeNodeLinkedList.isEmpty()) {
            TreeNode currentNode = treeNodeLinkedList.poll();
            String  temp = stringList[i];
            if(temp.compareTo("null")!=0) {
                currentNode.left = new TreeNode(Integer.valueOf(temp));
                treeNodeLinkedList.offer(currentNode.left);
            }
            i++;
            temp = stringList[i];
            if(temp.compareTo("null")!=0) {
                currentNode.right = new TreeNode(Integer.valueOf(temp));
                treeNodeLinkedList.offer(currentNode.right);
            }
            i++;
            if(i>= stringList.length) {
                break;
            }
        }
        return root;
    }

2、层序遍历二叉树

复制代码
public static List<List<Integer>> levelShow(TreeNode root) {
        List<List<Integer>> listList = new ArrayList<>();
        LinkedList<TreeNode> treeNodeLinkedList = new LinkedList<>();
        treeNodeLinkedList.offer(root);
        while(!treeNodeLinkedList.isEmpty()) {
            int size = treeNodeLinkedList.size();
            List<Integer> rowInfo = new ArrayList<>();
            for(int i =0;i< size;i++) {
                TreeNode treeNode = treeNodeLinkedList.poll();
                // 读取数据
                rowInfo.add(treeNode.value);
                if(treeNode.left !=null) {
                    treeNodeLinkedList.offer(treeNode.left);
                }
                if(treeNode.right !=null) {
                    treeNodeLinkedList.offer(treeNode.right);
                }
            }
            listList.add(rowInfo);
        }
        return listList;
    }

3、获取树中节点的个数

复制代码
    /**
     * 获取树中节点的个数
     * @param root
     * @return
     */
    public int size(TreeNode root) {
        if(root == null) {
            return 0;
        }
        //递归遍历左子树
        int a = size(root.left);
        int b= size(root.right);
        return a + b+ 1;
    }

4、获取叶子节点的个数

复制代码
   /**
     * 获取叶子节点的个数
     * @param root
     * @return
     */
    public int getLeaf(TreeNode root) {
        if(root == null)  {
            return 0;
        }
        if(root.left == null &&root.right == null) {
            // 判断叶子左右节点是否为空,若为空则为叶子节点
            return 1;
        }
        int getLeafLeft = getLeaf(root.left);
        int getLeafRight = getLeaf(root.right);
        return getLeafLeft + getLeafRight;
    }

5、获取第k层的节点个数

复制代码
/**
     * 获取第k层的节点个数
     * @param root
     * @param k
     * @return
     */
    public static int getKLevelNode(TreeNode root,int k) {
        if(root == null) {
            return 0;
        }
        if(k == 1) {
            return 1;
        }
        int getKLevelNodeLeft =  getKLevelNode(root.left , k-1);
        int getKLevelNodeRight = getKLevelNode(root.right , k -1);
        return getKLevelNodeLeft +getKLevelNodeRight;
    }

6、查询对应值的节点

复制代码
    public static TreeNode find(TreeNode root, int val) {
        if(root == null) {
             return null;
        }
        if(root.value == val) {
             return root;
        }
        // 左子树查找val 使用对应的值
        TreeNode leftTree = find(root.left, val);
        // 接收值不为 null ,说明左子树已经查找到val
        if(leftTree != null) {
            return leftTree;
        }
        // 右子树查找val, 使用 rightTree 来接收
        TreeNode rightTree = find(root.right ,val);
        if(rightTree !=null) {
             return rightTree;
        }
        // 走到这一步说明左右子树都没有找到val,直接返回null
        return null;
    }

7、是否是完全二叉树

复制代码
public static boolean isCompleteTree(TreeNode root) {
        LinkedList<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        boolean isStep1 = true;
        while(!queue.isEmpty()) {
            TreeNode node = queue.poll();
            if(isStep1) {
                if(node.left !=null && node.right != null) {
                    queue.offer(node.left);
                    queue.offer(node.right);
                } else if(node.left  !=null){
                    queue.offer(node.left);
                    isStep1 = false;
                } else if(node.right !=null) {
                    return false;
                }  else {
                    isStep1 = false;
                }
            } else {
                // 到达第二轮的时候,如果两者存在一个为空的就说明不是完全二叉树
                if(node.left!=null || node.right !=null) {
                    return false;
                }
            }
        }
        return true;
    }

8、两棵树是否完全相同

复制代码
    /**
     * 检查两颗树是否相同
     * @param p
     * @param q
     * @return
     */
    public static boolean isSameTree(TreeNode p, TreeNode q) {
        if( p== null&&  q== null) {
            return true;
        }
        if ( p == null || q == null) {
             return false;
        }
        if(p.value == q.value) {
            return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);
        }
        return false;
    }

9、一颗树是否是另一个树的子树

复制代码
    /**
     * 判断是否是子树
     * @param root
     * @param subRoot
     * @return
     */
    public static boolean isSubTree(TreeNode root ,TreeNode subRoot) {
        if(subRoot == null) {
             return true;
        }
        if(root == null) {
             return false;
        }
        // 递归判断
        return isSameTree(root,subRoot) || isSubTree(root.left,subRoot) ||
                isSubTree(root.right,subRoot);
    }

10、打印从根节点到子节点的路径

复制代码
 /**
     * 打印对应根节点到子节点的路径
     * @param root
     */
    public  static void showTrace(TreeNode root) {
        List<String> result = new ArrayList<>();
        // 声明一个队列
        LinkedList<TreeNode> queue = new LinkedList<>();
        // 记录路径信息
        LinkedList<String> stringLinkedList = new LinkedList<>();
        queue.offer(root);
        stringLinkedList.offer(root.value + "");
        while(queue !=null) {
            TreeNode tempNode =queue.poll();
            String currentPath = stringLinkedList.poll();
            // 说明不是子节点
            if(tempNode.left == null && tempNode.right == null) {
                result.add(currentPath);
            }
            if(tempNode.left  != null) {
                queue.offer(tempNode.left);
                stringLinkedList.offer(currentPath + "->" + tempNode.left.value);
            }
            if(tempNode.right !=null) {
                queue.offer(tempNode.right);
                stringLinkedList.offer(currentPath + "->" + tempNode.right.value);
            }
        }
        for(String item: result) {
            System.out.println(item);
        }
    }
相关推荐
云空2 分钟前
《探索电脑麦克风声音采集多窗口实时可视化技术》
人工智能·python·算法
麦兜*6 分钟前
【Spring Boot】Spring Boot 4.0 的颠覆性AI特性全景解析,结合智能编码实战案例、底层架构革新及Prompt工程手册
java·人工智能·spring boot·后端·spring·架构
野犬寒鸦15 分钟前
MyBatis-Plus 中使用 Wrapper 自定义 SQL
java·数据库·后端·sql·mybatis
沧澜sincerely16 分钟前
二分查找【各种题型+对应LeetCode习题练习】
算法·leetcode·二分查找
expect7g22 分钟前
Java的DNS缓存问题
java·后端
oioihoii22 分钟前
C++11中的std::minmax与std::minmax_element:原理解析与实战
java·开发语言·c++
大千AI助手26 分钟前
RLHF:人类反馈强化学习 | 对齐AI与人类价值观的核心引擎
人工智能·深度学习·算法·机器学习·强化学习·rlhf·人类反馈强化学习
karry01301 小时前
高并发导致重复key问题--org.springframework.dao.DuplicateKeyException
java·数据库·ide
全栈凯哥1 小时前
20.缓存问题与解决方案详解教程
java·spring boot·redis·后端·缓存
小莫分享1 小时前
2023年最新总结,阿里,腾讯,百度,美团,头条等技术面试题目,以及答案,专家出题人分析汇总。
java·后端·面试·职场和发展