剑指offer-刷题笔记-中难题-JZ8 二叉树的下一个结点
版本1-暴力方法
/*
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:
vector<TreeLinkNode*> vin;
//中序遍历
void getTreeNodeValue(TreeLinkNode* pNode)
{
if(pNode->left != NULL)
{
//vin.push_back(pNode->left->val);
getTreeNodeValue(pNode->left);
}
if(pNode != NULL)
{
vin.push_back(pNode);
}
if(pNode->right != NULL)
{
//vin.push_back(pNode->right->val);
getTreeNodeValue(pNode->right);
}
}
TreeLinkNode* GetNext(TreeLinkNode* pNode) {
if(pNode == NULL)
return NULL;
//传入的为局部子树,意思是要自己找到根节点
TreeLinkNode* root = pNode;
while (root->next) {
root = root->next;
}
getTreeNodeValue(root);
for(int i = 0;i < vin.size();i++)
{
if(pNode->val == vin[i]->val)
{
return vin[i+1];
}else{
continue;
}
}
return NULL;
}
};
版本2- 利用中序遍历性质
/*
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)
return NULL;
// 若该结点存在右子树
if (pNode->right) {
TreeLinkNode* rightChild = pNode->right;
// 寻找右子树上的最左孩子
while (rightChild->left)
rightChild = rightChild->left;
return rightChild;
}
// 若不存在右子树,寻找第一个右父亲
while (pNode->next) {
if (pNode->next->left == pNode)
return pNode->next;
pNode = pNode->next;
}
return NULL;
}
};