菜鸟笔记
提升您的技术认知

《剑指offer》二叉树的下一个结点-ag真人游戏

阅读 : 303

题目描述:

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

解题思路:

  首先要做的就是要知道二叉树的中序遍历。具体如下:

结合上图,我们可发现分成两大类:

1、有右子树的,那么下个结点就是右子树最左边的点;(eg:d,b,e,a,c,g)

2、没有右子树的,也可以分成两类:(a)是父节点左孩子(eg:n,i,l) ,那么父节点就是下一个节点 ;b)是父节点的右孩子(eg:h,j,k,m)找他的父节点的父节点的父节点…直到当前结点是其父节点的左孩子位置。如果没有eg:m,那么他就是尾节点。)。

代码实现(c )

/*
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 == null){
            return null;
        }
        treelinknode* pnext = null;
        // 当前结点有右子树,那么它的下一个结点就是它的右子树中最左子结点
        if(pnode->right != null){
            treelinknode* pright = pnode->right;
            while(pright->left != null){
                pright = pright-> left;
            }
            pnext = pright;
        }
        // 当前结点无右子树,则需要找到一个是它父结点的左子树结点的结点
        else if(pnode->next != null){
            // 当前结点
            treelinknode* pcur = pnode;
            // 父节点
            treelinknode* ppar = pnode->next;
            while(ppar != null && pcur == ppar->right){
                pcur = ppar;
                ppar = pcur->next;
            }
            pnext = ppar;
        }
        return pnext;
    }
};
网站地图