二叉树有关习题整理543二叉树的直径 606根据二叉树创建字符串 KY11二叉树遍历 - 牛客105从前序遍历与中序遍历构造二叉树
Posted 王嘻嘻-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树有关习题整理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从前序遍历与中序遍历构造二叉树的主要内容,如果未能解决你的问题,请参考以下文章