二叉树有关习题整理543二叉树的直径 606根据二叉树创建字符串 KY11二叉树遍历 - 牛客105从前序遍历与中序遍历构造二叉树

Posted 王嘻嘻-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树有关习题整理543二叉树的直径 606根据二叉树创建字符串 KY11二叉树遍历 - 牛客105从前序遍历与中序遍历构造二叉树相关的知识,希望对你有一定的参考价值。

目录

543、二叉树的直径 - 力扣

606、根据二叉树创建字符串- 力扣

KY11、二叉树遍历 - 牛客

105、从前序遍历与中序遍历构造二叉树 - 力扣


543、二叉树的直径 - 力扣

思路:本题中最长路径可能不过根节点**,运用递归求每个结点的高度,最后返回该节点子树的深度。

class Solution 
    //当前二叉树的最长路径
    private int max = 0;
    public int diameterOfBinaryTree(TreeNode root) 
        if (root == null || (root.left == null && root.right == null)) 
            //空树或者只有根节点,不存在边
            return 0;
        
        height(root);
        return max;
    

    //递归求每个节点的高度
    private int height(TreeNode root) 
        if (root == null) 
            return 0;
        
        //计算左子树高度
        int L = height(root.left);
        //计算右子树高度
        int R = height(root.right);
        max = Math.max(max,(L + R));
        return 1 + Math.max(L,R);
    

606、根据二叉树创建字符串- 力扣

 思路:若节点的左右子树都为空不加括号;若节点的左子树不空,右子树为空,不加括号;当左空右不空时,才需要添加一个()来占位,占左子树。

class Solution 
    StringBuilder sb = new StringBuilder();
    /**
     * 传入一颗以root为根的二叉树,
     * 就能按照前序遍历的方式将其转换为字符串
     * @param root
     * @return
     */
    public String tree2str(TreeNode root) 
        if (root == null) 
            return "";
        
        //先访问根节点,此处的访问就是直接将结点值拼接到sb中即可
        sb.append(root.val);
        //再去处理左子树的情况
        if (root.left != null) 
            //左子树不为空,递归转换左子树,将其拼接到sb中
            sb.append("(");
            tree2str(root.left);
            sb.append(")");
        else 
            //此时左子树为空,判断右树是否为空,叶子节点也不加括号
            //只有左空右不空时才添加括号
            if (root.right != null) 
                //左树空,右树不空
                sb.append("()");
            
        
        //再处理右子树
        //此时左右子树都不为空
        if (root.right != null) 
            sb.append("(");
            tree2str(root.right);
            sb.append(")");
        
        return sb.toString();
    

KY11、二叉树遍历 - 牛客

 思路:根据前序遍历:根左右 - 第一个节点一定是当前树的根节点;使用index变量来表示当前处理到哪个字符了;构建好二叉树然后进行中序遍历。

import java.util.*;

//根据前序遍历结果构建二叉树
public class Main 
    private static 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;
        
    

    //index表示当前前序遍历处理到那个字符了
    private static int index = 0;
    public static void main(String[] args) 
        Scanner scanner = new Scanner(System.in);
        //多组输入
        while (scanner.hasNext())
            //每一次读取前一行遍历的结果
            String str = scanner.next();
            //根据前序遍历的字符串构建二叉树
            TreeNode root = preOrderBuild(str);
            //对其使用中序遍历,输出节点值
            inOrder(root);
            //每行输出独占一行
            System.out.println();
            index = 0;
        
    

    /**
     * 根据前序遍历的字符串来构建二叉树
     * 根左右
     * @param str
     * @return
     */
    private static TreeNode preOrderBuild(String str) 
        char cur = str.charAt(index);
        if (cur == '#') 
            return null;
        
        TreeNode root = new TreeNode(cur);
        index ++;
        root.left = preOrderBuild(str);
        index ++;
        root.right = preOrderBuild(str);
        return root;
    

    private static void inOrder(TreeNode root) 
        if (root == null) 
            return;
        
        // 先递归左子树
        inOrder(root.left);
        // 根
        System.out.print(root.val + " ");
        // 再右子树
        inOrder(root.right);
    

105、从前序遍历与中序遍历构造二叉树 - 力扣

思路:前序:根左右,当前结果的第一个值一定是当前树的根节点;中序:左根右,中序结果集,左树都在根的左侧,右树结果都在根右侧
1、不断从前序遍历结果集中取出元素,此元素作为当前树的根节点                                                2、拿着根节点去中序遍历中查找该节点值所处的位置,数组左侧就是左子树,右侧就是右子树    3、递归上述流程,直到前序遍历结果集全部遍历结束。

class Solution 
   //当前处理到前序遍历的节点
    private int index = 0;
    public TreeNode buildTree(int[] preorder, int[] inorder) 
        return buildTreeHelper(preorder,inorder,0,preorder.length - 1);
    

    //再preOrder的[left~right]借助中序遍历还原二叉树,返回二叉树的根节点
    private TreeNode buildTreeHelper(int[] preorder, int[] inorder, int left, int right) 
        //边界
        if (left > right) 
            return null;
        
        if (index == preorder.length) 
            return null;
        
        //先存储根节点
        TreeNode root = new TreeNode(preorder[index]);
        //下标继续向后移动 遍历数组
        index ++;
        //标记位
        int pos = find(root.val,inorder);
        root.left = buildTreeHelper(preorder,inorder,left,pos - 1);
        root.right = buildTreeHelper(preorder, inorder, pos + 1, right);
        return root;
    

    //找到val在中序遍历的索引位置
    private int find(int val, int[] inorder) 
        for (int i = 0; i < inorder.length; i++) 
            if (inorder[i] == val) 
                return i;
            
        
        return -1;
    

本小节完^_^

以上是关于二叉树有关习题整理543二叉树的直径 606根据二叉树创建字符串 KY11二叉树遍历 - 牛客105从前序遍历与中序遍历构造二叉树的主要内容,如果未能解决你的问题,请参考以下文章

543-二叉树的直径

543. 二叉树的直径

LeetCode 543. 二叉树的直径

微软面试题: LeetCode 543. 二叉树的直径出现次数:3

Leetcode 543.二叉树的直径

543.二叉树的直径