暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

《程序猿笔试题系列》之 二叉树的下一个节点

JAVA的学习之路 2021-08-02
425

问题

       给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的next指针。下图为一棵有9个节点的二叉树。树中从父节点指向子节点的指针用实线表示,从子节点指向父节点的用虚线表示。

示例:

输入:{8,6,10,5,7,9,11},8

返回:9

解析:这个组装传入的子树根节点,其实就是整颗树,中序遍历{5,6,7,8,9,10,11},根节点8的下一个节点就是9,应该返回{9,10,11},后台只打印子树的下一个节点,所以只会打印9,如下图,其实都有指向左右孩子的指针,还有指向父节点的指针,下图没有画出来



输入描述:

输入分为2段,第一段是整体的二叉树,第二段是给定二叉树节点的值,后台会将这2个参数组装为一个二叉树局部的子树传入到函数GetNext里面,用户得到的输入只有一个子树根节点

返回值描述:

返回传入的子树根节点的下一个节点,后台会打印输出这个节点

示例1

输入:
{8,6,10,5,7,9,11},8
返回值:
9


示例2

输入:
{8,6,10,5,7,9,11},6
返回值:
7


示例3

输入:
{1,2,#,#,3,#,4},4
返回值:
1


示例4

输入:
{5},5
返回值:
"null"
说明:
不存在,后台打印"null"

思路分析

1、最简单的是看到这个题目,就直接暴力解法,将所有的中序遍历的数据都得到,然后进行遍历就可以了

/**
时间复杂度 0(n),空间复杂度0(n)
*/
import java.util.*;
public class Solution {
static ArrayList<TreeLinkNode> list = new ArrayList<>();
public TreeLinkNode GetNext(TreeLinkNode pNode){

TreeLinkNode par = pNode;
while(par.next != null){
par = par.next;
}
InOrder(par);
for(int i=0;i<list.size();i++){
if(pNode == list.get(i)){
return i == list.size()-1?null:list.get(i+1);
}
}
return null;
}
void InOrder(TreeLinkNode pNode){
if(pNode!=null){
InOrder(pNode.left);
list.add(pNode);
InOrder(pNode.right);
}
}
}


2、最优解法

a. 分析

    以该二叉树为例,中序遍历为:{D,B,H,E,I,A,F,C,G}

       



仔细观察,可以把中序下一结点归为几种类型:

  1. 有右子树,下一结点是右子树中的最左结点,例如 B,下一结点是 H

  2. 无右子树,且结点是该结点父结点的左子树,则下一结点是该结点的父结点,例如 H,

    下一结点是 E

  3. 无右子树,且结点是该结点父结点的右子树,则我们一直沿着父结点追朔,直到找到某

    个结点是其父结点的左子树,如果存在这样的结点,那么这个结点的父结点就是我们要

    找的下一结点。例如 I,下一结点是 A;例如 G,并没有符合情况的结点,所以 G 没有

    下一结点

/**
时间复杂度:0(n)
空间复杂度:0(1)
*/
public class Solution {
 
public TreeLinkNode GetNext(TreeLinkNode pNode) {
     // 1.
     if (pNode.right != null) {
         TreeLinkNode pRight = pNode.right;
         while (pRight.left != null) {
             pRight = pRight.left;
         }
         return pRight;
     }
     // 2.
     if (pNode.next != null && pNode.next.left == pNode) {
         return pNode.next;
     }
     // 3.
     if (pNode.next != null) {
         TreeLinkNode pNext = pNode.next;
         while (pNext.next != null && pNext.next.right == pNext) {
             pNext = pNext.next;
         }
         return pNext.next;
     }
     return null;
 }
}







《程序猿笔试题系列》之 二叉树的中序遍历

《程序猿数据结构系列》之 深入学习二叉树

二叉树基础知识

历史文章及资料

第一节阶段:Java 基础入门
第二阶段:数据库

第三阶段:设计模式

第四阶段:JDBC、Java8、JavaSE和Html&CSS

第五阶段:框架

第六阶段:必备技能

第七阶段:JVM

第八阶段:线程及线程池

Java经典编程50题





- THE END -

作者简介

Mr.W

白天搬砖,晚上砌梦想。

相信每个人有故事,程序员更是有许多事故,书写最接地气的程序员故事,为大家找出更好的资料。




文章转载自JAVA的学习之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论