【剑指Offer】8——二叉树的下一个节点

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

A:因为是中序遍历,节点是左->中->右

 (1)该节点有右子树:下一个节点是,该节点的右子树的左节点

 (2)该节点没有右子树,是其父节点的左节点:下一个节点是,其父节点

 (3)该节点没有右子树,是其父节点的右节点:向上遍历,找到一个节点是其父节点的左节点,下一个节点是,找到的那个节点的父节点

/*
struct TreeLinkNode {
    int val;
    struct TreeLinkNode *left;
    struct TreeLinkNode *right;
    struct TreeLinkNode *next; //父节点
    TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
        
    }
};
*/
class Solution {
public:
    TreeLinkNode* GetNext(TreeLinkNode* pNode)
    {
        if(pNode == nullptr)
        {
            return nullptr;
        }
        //有右子树:它的下一个节点是,该节点右节点的左节点
        if(pNode->right != nullptr)
        {
            pNode = pNode->right;
            while(pNode->left != nullptr)
            {
                pNode = pNode->left;
            }
            return pNode;
        }
        while(pNode->next != nullptr)
        {
            //没有右子树:该节点是父节点的左节点,它的下一个节点是其父节点
            if(pNode == pNode->next->left)
            {
                return pNode->next;
            }
            //没有右子树:该节点是它父节点的右节点,沿着父节点向上遍历,直到找到一个父节点的左节点
            else
            {
                pNode = pNode->next;
            }
        }
        return nullptr;
    }
};

  

相关题目:

  判断一颗满二叉树是否为二叉搜索树:给定一棵满二叉树,判定该树是否为二叉搜索树,是的话打印True,不是的话打印False

  二叉树:有一棵二叉树,树上每个点标有权值,权值各不相同,请设计一个算法算出权值最大的叶节点到权值最小的叶节点的距离。二叉树每条边的距离为1,一个节点经过多少条边到达另一个节点为这两个节点之间的距离。给定二叉树的根节点root,请返回所求距离。

  树的不同形态:给定二叉树T(树深度不超过H<=10,深度从1开始,节点个数N<1024,节点编号1~N)的层序和中序遍历,输出T从左向右叶子节点以及树先序和后序遍历序列

  

猜你喜欢

转载自www.cnblogs.com/xiexinbei0318/p/11415895.html