题目描述:
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
解题思路:
首先要做的就是要知道二叉树的中序遍历。具体如下:
结合上图,我们可发现分成两大类:
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;
}
};