寻找二叉树的下一个节点

寻找二叉树的下一个节点

题目链接

牛客网

题目描述

给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的next指针 .

示例:

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

返回:9

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

img

数据范围:节点数满足 img ,节点上的值满足 img

要求:空间复杂度 img ,时间复杂度 img

输入描述

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

返回值描述

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

示例1

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

返回:9

示例2

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

返回:7

创建二叉树

class TreeNode {
    public Integer val;
    public TreeNode left;
    public TreeNode right;
    public TreeNode next;

    public TreeNode() {
    }

    public TreeNode(Integer val) {
        this.val = val;
    }


    public Integer getVal() {
        return val;
    }

    public TreeNode getNext() {
        return next;
    }

    public void setNext(TreeNode next) {
        this.next = next;
    }

    public void setVal(Integer val) {
        this.val = val;
    }

    public TreeNode getLeft() {
        return left;
    }

    public void setLeft(TreeNode left) {
        this.left = left;
    }

    public TreeNode getRight() {
        return right;
    }

    public void setRight(TreeNode right) {
        this.right = right;
    }
}


//中序遍历 左根右
static List<Integer> middleList = new ArrayList<>();
public static void middleTraverse(TreeNode node) {
    if (node.left != null) {
        middleTraverse(node.left);
    }
    middleList.add(node.val);
    if (node.right != null) {
        middleTraverse(node.right);
    }
}

寻找节点

二叉树
//二叉树的下一个节点
    /**
     * 仔细观察,(前序 ABDEHICFG)  中序(DBHEIAFCG) 下一结点归为几种类型:
     * 1、有右子树,下一结点是右子树中的最左结点,例如 B,下一结点是 H
     * 2、无右子树,且结点是该结点父结点的左子树,则下一结点是该结点的父结点,例如 H,下一结点是 E
     * 3、无右子树,且结点是该结点父结点的右子树,则一直沿着父结点追朔,直到找到某个结点是其父结点的左子树,
     * 如果存在这样的结点,那么这个结点的父结点就是我们要找的下一结点。例如 I,下一结点是 A;例如 G,
     * 并没有符合情况的结点,所以 G 没有下一结点
     * @param node
     * @return
     */
    public static TreeNode getTreeNode(TreeNode node) {
        if(node == null){
            return null;
        }
        //如果当前节点的右子树不为空
        if(node.right != null) {
            node = node.right;
            while (node.left != null) {
                node = node.left;
            }
            return node;
        }

        //当前节点无右子树时,判断节点是父节点的左子树还是右子树
        //中序(DBHEIAFCG)
        while (node.next != null) {
            if(node.next.left == node) {
                return node.next;
            }
            node = node.next;
        }
        return null;
    }

验证

public static void main(String[] args) {
        //下面 1代表A 2代表B 以此类推
        TreeNode node1 = new TreeNode(1);
        TreeNode node2 = new TreeNode(2);
        TreeNode node3 = new TreeNode(3);
        TreeNode node4 = new TreeNode(4);
        TreeNode node5 = new TreeNode(5);
        TreeNode node6 = new TreeNode(6);
        TreeNode node7 = new TreeNode(7);
        TreeNode node8 = new TreeNode(8);
        TreeNode node9 = new TreeNode(9);

        node1.setLeft(node2);
        node1.setRight(node3);
        node2.setLeft(node4);
        node2.setRight(node5);
        node5.setLeft(node8);
        node5.setRight(node9);
        node3.setLeft(node6);
        node3.setRight(node7);

        node4.setNext(node2);
        node2.setNext(node8);
        node8.setNext(node5);
        node5.setNext(node9);
        node9.setNext(node1);
        node1.setNext(node6);
        node6.setNext(node3);
        node3.setNext(node7);

        middleTraverse(node1);
        System.out.println(middleList);

        TreeNode treeNode = getTreeNode(node2);
        System.out.println(treeNode.getVal());
    }
posted @   China熊孩子  阅读(64)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理

阅读目录(Content)

此页目录为空

点击右上角即可分享
微信分享提示