二叉树的基本操作3(TODO)

这篇博客介绍了如何根据先序遍历字符串创建二叉树,并进行中序遍历。同时,文章讲解了在给定二叉树中找到两个指定节点最近公共祖先的方法,提供了解题思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二叉树的创建和遍历

(递归思想)

编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: 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;
        }

!!!以上一步还没有搞明白

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值