题目:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
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从左向右叶子节点以及树先序和后序遍历序列