IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 二叉树最深间隔最远节点 -> 正文阅读

[数据结构与算法]二叉树最深间隔最远节点

题目

给定一棵非空二叉树,数据域值为不等于0的整数。请编写程序找出其最深层间隔最远的两个结点,输出这两个结点差的绝对值。如图1所示的各二叉树最深层间隔最远的结点为5和8。如果最深层只有一个结点,则输出0。

27231f42-28d3-4b16-95a8-f0b19f3f48b3.jpg

输入格式:

输入为一组用空格间隔的整数,个数不超过200个,表示带空指针信息的二叉树先根序列,其中空指针信息用0表示。

输出格式:

输出为一个整数,为二叉树最深层间隔最远的两个结点差的绝对值,如果最深层只有一个结点,则输出0。

输入样例1:

1 2 0 5 0 0 3 6 0 0 8 0 0

输出样例1:

在这里给出相应的输出。例如:

3

?思路

采用中序遍历法时,遍历规则是 左 -中 -右,最深层第一个被遍历到的节点一定是最深层最左边的节点,最深层最后一个被遍历的节点一定是最后一个节点。

在创建二叉树时需要给每个节点添加一个depth深度属性,方便遍历查找。

节点类

class MyNode{
    String val;
    MyNode left;
    MyNode right;
    int depth;

    public MyNode(){
    }

}

创建二叉树

public MyNode createTree(){
        MyNode node;
        String ch=array[index];//这是输入的数据
        index++;//下标++
        if (ch.equals("0")){
            node=null;
        }else{
            depth++;//深度++
            node=new MyNode();
            node.depth=depth;
            node.val=ch;
            node.left=createTree();//创建子树
            depth=node.depth;//修正层数
            node.right=createTree();

            if (node.depth>maxDepth)
                maxDepth=node.depth;
        }

        return node;
    }

Tree类

class Tree{

    MyNode root;
    int index;
    String[] array;
    int depth;//记录最大深度
    int maxDepth;
    MyNode[] distance;//第一个记录深度最左边的节点,第二个记录最右边的节点

    public Tree(String[] array){
        this.array=array;
        maxDepth=0;
        depth=0;
        distance=new MyNode[2];
       root=createTree();

    }
    public MyNode createTree(){
        MyNode node;
        String ch=array[index];
        index++;//下标++
        if (ch.equals("0")){
            node=null;
        }else{
            depth++;//深度++
            node=new MyNode();
            node.depth=depth;
            node.val=ch;
            node.left=createTree();//创建子树
            depth=node.depth;//修正层数
            node.right=createTree();

            if (node.depth>maxDepth)
                maxDepth=node.depth;
        }

        return node;
    }

    public int compute(){
        search(root);
        if (distance[0]!=null&&distance[1]!=null)
            return Math.abs(Integer.parseInt(distance[0].val)-Integer.parseInt(distance[1].val));
        else
            return 0;//只有一个节点返回0
    }

    public void search(MyNode node){
        if (node==null)
            return;

        if (node.left!=null)
            search(node.left);

        if (node.depth==maxDepth){//等于最大深度
            if (distance[0]!=null)//最左节点不为空
                distance[1]=node;//覆盖最右节点
            else
                distance[0]=node;
        }

        if (node.right!=null)
            search(node.right);
    }

}

完整代码


import java.util.Scanner;

public class test5 {
    static Scanner input=new Scanner(System.in);
    public static void main(String[] args) {
        String[] array=input.nextLine().split(" ");
        Tree tree=new Tree(array);
        System.out.println(tree.compute());
    }
}
class Tree{

    MyNode root;
    int index;
    String[] array;
    int depth;//记录最大深度
    int maxDepth;
    MyNode[] distance;//第一个记录深度最左边的节点,第二个记录最右边的节点

    public Tree(String[] array){
        this.array=array;
        maxDepth=0;
        depth=0;
        distance=new MyNode[2];
       root=createTree();

    }
    public MyNode createTree(){
        MyNode node;
        String ch=array[index];
        index++;//下标++
        if (ch.equals("0")){
            node=null;
        }else{
            depth++;//深度++
            node=new MyNode();
            node.depth=depth;
            node.val=ch;
            node.left=createTree();//创建子树
            depth=node.depth;//修正层数
            node.right=createTree();

            if (node.depth>maxDepth)
                maxDepth=node.depth;
        }

        return node;
    }

    public int compute(){
        search(root);
        if (distance[0]!=null&&distance[1]!=null)
            return Math.abs(Integer.parseInt(distance[0].val)-Integer.parseInt(distance[1].val));
        else
            return 0;//只有一个节点返回0
    }

    public void search(MyNode node){
        if (node==null)
            return;

        if (node.left!=null)
            search(node.left);

        if (node.depth==maxDepth){
            if (distance[0]!=null)
                distance[1]=node;
            else
                distance[0]=node;
        }

        if (node.right!=null)
            search(node.right);
    }

}
class MyNode{
    String val;
    MyNode left;
    MyNode right;
    int depth;

    public MyNode(){
    }

}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-10 12:39:06  更:2021-11-10 12:39:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:34:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码