前記ノードの指定されたバイナリツリーは、先行順走査順序とリターンの次のノードを見つけます。ツリー内のノードは、左と右の子ノードではないだけを含むことに注意してください、親ノードは、を指すポインタが含まれています。
/*
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)
{
TreeLinkNode* p = nullptr;
if (pNode->right != nullptr) //要是中序遍历的下一个结点肯定是,在右子树上
{
p = pNode->right;
while (p->left)
{
p = p->left;
}
return p;
}
//到达这一步的话就说明,该节点的右子树为空
//右子树为空的话,那么该结点中序遍历的下一个节点就一定在祖先节点
//但是这个祖先节点是有要求的,就是该节点必须是祖先节点的左子树上面的结点
p = pNode;
while (p->next != nullptr && p->next->right == p) //这一步执行完毕之后
{
p = p->next;
}
return p->next; //注意返回值,是p->next
}
};
右の部分木は、ノードが与えられたとき、図の場合のように、空です。
二分探索木を考えると、その中の最初のk小さいノードを検索してください。例えば、(5,3,7,2,4,6,8)と、第3の接続点に係る数値は、4要約です。
回答ポップ
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
void find(TreeNode* tree)
{
if(tree == nullptr)
return;
find(tree->left);
vec.push_back(tree);
find(tree->right);
}
TreeNode* KthNode(TreeNode* pRoot, int k)
{
if(pRoot == nullptr || k <= 0)
return nullptr;
find(pRoot);
if(k > vec.size())
return nullptr;
return vec[k - 1];
}
private:
vector<TreeNode*> vec;
};
余分なスペースの無駄がそう秒でありますが、
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
int count = 0;
TreeNode* KthNode(TreeNode* pRoot, int k)
{
if(pRoot && k > 0)
{
TreeNode* ret = KthNode(pRoot->left,k);
if(ret) //为了提高效率
return ret;
if(++count == k) //切记这里是++count不是count++
return pRoot;
TreeNode* ret_right = KthNode(pRoot->right,k);
if(ret_right) //为了提高效率
return ret_right;
}
return nullptr;
}
};