二叉树的创建和遍历
(递归思想)
编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。
输入描述:
输入包括1行字符串,长度不超过100。
输出描述:
可能有多组测试数据,对于每组数据,
输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。
每个输出结果占一行。
示例1
输入
复制
abc##de#g##f###
输出
复制
c b e g d f a
题目来源:牛客网
import java.util.Scanner;
public class BuildBinaryTree {//二叉树的基本结构
static class TreeNode{
public char val;
public TreeNode left;
public TreeNode right;
public TreeNode(char val) {
this.val = val;
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()){//循环输入测试数据
//line记录当前字符串
String line = scanner.next();
TreeNode root = buildTreehelper(line);//创建二叉树(用先序遍历创建)
inOrder(root);//创建好的二叉树用中序来遍历
System.out.println();
}
}
static int index = 0;//记录当前字符串的下标
public static TreeNode buildTreehelper(String line){//这是一个辅助建树的方法
index = 0;//因为测试数据会有很多组,所以输完一组,再输入下一组时,需要更新index的值
为0(index的值记录当前字符串的下标,不更新这个值会一直增加,然后就出类似下标越界这样的
问题)
if(index < 0 || index >= line.length()){ //对index值得合法性进行校验
return null;
}
return creatPreOrderTree(line);
}
public static TreeNode creatPreOrderTree(String line){//先序创建二叉树
if(index < 0 || index >= line.length()){ //对index值得合法性进行校验
return null;
}
char c = line.charAt(index); //获取字符串中的每一个字符
if(c == '#'){ //'#'代表空
return null;
}
TreeNode root = new TreeNode(c);//创建跟结点
index ++;//更新字符串的下标值(为了获取下一个元素)
root.left = creatPreOrderTree(line);//递归遍历左子树
index ++;
root.right = creatPreOrderTree(line);//递归遍历右子树
return root;//返回跟结点
}
public static void inOrder(TreeNode root){//中序遍历二叉树
if(root == null){
return;
}
inOrder(root.left);
//System.out.println(root.val + ' ');//字符加字符转为int了
System.out.print(root.val + " ");
inOrder(root.right);
}
}
二叉树最近的公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]
示例 1:
输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出: 3
解释: 节点 5 和节点 1 的最近公共祖先是节点 3。
示例 2:
输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出: 5
解释: 节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。
说明:
所有节点的值都是唯一的。
p、q 为不同节点且均存在于给定的二叉树中。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
private TreeNode ans = null;//保存公共节点的变量
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
findAns(root,p,q);
return this.ans;
}
public boolean findAns(TreeNode curNode,TreeNode p,TreeNode q){
if(curNode == null){
return false;
}
int left = findAns(curNode.left,p,q)?1:0;
int right = findAns(curNode.right,p,q)?1:0;
int mid = (curNode == p||curNode == q)?1:0;
if(left + right + mid >= 2){
this.ans = curNode;
}
return(left + right + mid) > 0;
}
}
if(left + right + mid >= 2){
this.ans = curNode;
}
!!!以上一步还没有搞明白