剑指offer之二叉树的下一个结点

简介: 剑指offer之二叉树的下一个结点

1 问题

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


2 分析

比如我现在的二叉树如下

                4
           2         6
        1     3   5     7 

这里分3种情况


1) 如果这个节点包含右子树,那么下一个节点就是这个右子树的最左下节点,比如节点4的下一个节点是5.


2) 如果这个节点不包含右子树,如果这个节点的父节点的左子节点是同一个,那么下一个节点就是这个节点的父节点,比如节点6的下一个节点就是7.


3) 如果这个节点不包含右子树,如果这个节点的父节点的右子节点是同一个,这里分2种情况,我们先找到这节点的父结点,然后父节点的指针一直向上遍历,直到找到一个是它父结点的左子结点的结点。如果这样的结点存在,那么这个结点的父结点就是我们要找的下一个结点,比如节点3的下一个节点是4,也有可能没有下一个节点,比如节点7的下一个节点就是空。


3 代码实现

typedef struct Tree
{
    int value;
    struct Tree* left;
    struct Tree* right;
    struct Tree* parent;
    Tree(int value) : value(value), left(NULL), right(NULL), parent(NULL) {}
    Tree() : value(0), left(NULL), right(NULL), parent(NULL) {}
} Tree;
Tree* getNext(Tree* node)
{
    if (NULL == node)
        return NULL;
    Tree* nextNode = NULL;
    if (NULL != node->right)
    {
        Tree* rightNode = node->right;
        while (rightNode->left != NULL)
        {
            rightNode = rightNode->left;
        }
        nextNode = rightNode;
    }
    else
    {
        Tree* currentNode = node;
        Tree* parentNode = currentNode->parent;
        while (NULL != parentNode && parentNode->right == currentNode)
        {
            currentNode = parentNode;
            parentNode = currentNode->parent;
        }
        nextNode = parentNode;
    }
    return nextNode;
}


相关文章
|
8月前
|
消息中间件 Kubernetes NoSQL
剑指offer常见题 - 二叉树问题(一)
剑指offer常见题 - 二叉树问题(一)
|
8月前
|
消息中间件 Kubernetes NoSQL
剑指offer常见题 - 二叉树问题(三)
剑指offer常见题 - 二叉树问题(三)
|
8月前
|
消息中间件 Kubernetes NoSQL
剑指offer常见题 - 二叉树问题(二)
剑指offer常见题 - 二叉树问题(二)
|
算法
【LeetCode题目详解】(五)144.二叉树的前序遍历、94.二叉树的中序遍历、145.二叉树的后序遍历、104.二叉树的最大深度、110.平衡二叉树
【LeetCode题目详解】(五)144.二叉树的前序遍历、94.二叉树的中序遍历、145.二叉树的后序遍历、104.二叉树的最大深度、110.平衡二叉树
60 0
|
8月前
|
算法 API DataX
二叉树(下)+Leetcode每日一题——“数据结构与算法”“对称二叉树”“另一棵树的子树”“二叉树的前中后序遍历”
二叉树(下)+Leetcode每日一题——“数据结构与算法”“对称二叉树”“另一棵树的子树”“二叉树的前中后序遍历”
|
8月前
|
存储 Serverless 索引
二叉树的前序遍历 、二叉树的最大深度、平衡二叉树、二叉树遍历【LeetCode刷题日志】
二叉树的前序遍历 、二叉树的最大深度、平衡二叉树、二叉树遍历【LeetCode刷题日志】
LeetCode刷题Day14——二叉树(完全二叉树、平衡二叉树、二叉树路径、左叶子之和)
一、完全二叉树的节点个数 题目链接:222. 完全二叉树的节点个数
剑指offer 58. 二叉搜索树的第k个结点
剑指offer 58. 二叉搜索树的第k个结点
58 0
剑指offer_二叉树---二叉搜索树的第k个结点
剑指offer_二叉树---二叉搜索树的第k个结点
69 0