バイナリツリーの次のノード、バイナリ検索ツリー要素小さいK

前記ノードの指定されたバイナリツリーは、先行順走査順序とリターンの次のノードを見つけます。ツリー内のノードは、左と右の子ノードではないだけを含むことに注意してください、親ノードは、を指すポインタが含まれています。

/*
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;
    }
};
公開された230元の記事 ウォン称賛28 ビュー9301

おすすめ

転載: blog.csdn.net/weixin_43767691/article/details/103827119
おすすめ