提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
基本思想
首先要明白二叉树中序遍历的特点,中序遍历:先遍历左子树,然后是根,最后是右子树。给定一个节点,要找出以中序遍历时,该节点的下一个节点(建议画出二叉树),如下图所示:
从中序遍历的结果我们可以看出:
4的下一个节点:2
2的下一个节点:5
5的下一个节点:1
1的下一个节点:6
6的下一个节点:3
3的下一个节点:7
不难发现,
- 若当前节点pNode没有右孩子时,pNode的下一个节点是要从该节点以上树的节点面开始找(看图),root=pNode->next此时分成两种情况:
(1) 如果当前节点pNode是root的左孩子,那么当前节点的中序遍历的下一个节点就是root(左根右)
(2) 如果当前节点pNode是root的右孩子,此时,我们需要往上继续找,找到一个节点root,使得其左子树的最右边的节点要是pNode - 若当前节点pNode有有孩子,那么中序遍历时,它的下一个节点为以当前节点为根的右子树的最左边的那个节点。
- 像节点”7“,他是中序序列的最后一个元素,它的下一个为NULL。这类情况其实在(2)寻找时,会因为root为空而不再寻找。
代码
//中序遍历的下一个节点 中序遍历:左根右
//如果当前节点没有右子树,:就要判断当前节点是父节点的左节点还是右节点:如果是其父节点的左孩子,那么当前节点在中序的下一个节点就是父节点,直接返回next即可
//如果是其父节点的右孩子,那么它的下一个节点p满足:p的左子树的最右边的节点是当前节点,只有这样,p的左子树遍历完时,
//当前节点是其左子树的中序遍历最后一个节点,进而当前节点中序遍历时下一个节点为p。画出二叉树会好理解一点
//如果当前节点有右子树,则返回当前节点右子树最左边的节点即为当前节点在中序遍历时的下一个节点
TreeLinkNode* GetNext(TreeLinkNode* pNode) {
if(pNode==NULL) return NULL;
if(pNode->right==NULL){
while(pNode->next){
TreeLinkNode* root=pNode->next;
if(root->left==pNode) return root;
pNode=root;
}
}
if(pNode->right!=NULL){
TreeLinkNode* p=pNode->right;
while(p->left !=NULL) p=p->left;
return p;
}
return NULL;
}
总结
刚开始做这个题的时候,没有考虑全面,忽略了(2)种情况中,如果是root的右孩子时,我一开始的想法以为pNode的下一个节点也是root,其实不是的。因为如果是root的右孩子,那么根据中序遍历的特点,它的下一个节点root要满足:root的左子树的最右边的节点为pNode。因为只有这样,当root的左子树遍历完(pNode为最后一个节点)时,该root才是pNode的下一个节点。多做题,多思考,多总结。编程路上,砥砺前行~