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

浙公网安备 33010602011771号