JZ57 二叉树的下一个结点
二叉树的下一个结点
题目:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
思路:根的前一个节点是左子树遍历的最后一个节点,根节点的下一个节点是右子树遍历的第一个节点,即右子树最左边的节点。
本题的思路是:按照当前节点是否有右子树进行划分。
如果有右子树,那么就是右子树遍历到的最左边的孩子节点。
如果没有右子树,就需要向上访问父节点,只要该父节点的父节点左孩子是父节点,就是第一个左转的节点,即为答案。
func GetNext(pNode *TreeLinkNode) *TreeLinkNode { if pNode == nil { return nil } //have right subtree if pNode.Right != nil { nextRight := pNode.Right for nextRight.Left != nil { nextRight = nextRight.Left } return nextRight } else{ //have not right subtree for pNode.Next != nil { if (pNode.Next.Left != nil) && (pNode.Next.Left == pNode) {//可以直接比较指针 return pNode.Next } pNode = pNode.Next } } return nil }