[剑指Offer]54-二叉搜索树的第k个节点

题目描述

给定一棵二叉搜索树,找出其中的第k小的结点,返回指向该节点的指针。

思路

中序遍历即可。
注意特判!报段错误数组越界这里就要考虑是少特判的问题。

法一:借助vector
法二(better)(学习的牛客网最佳解法):到第k个直接返回。
关键是理解:

if (pNode != nullptr) {
	return pNode;
}

有了这句话,当遍历到第k小的节点时,返回该节点指针,并会一路传出来。没有的话,则只是传给上层父节点,后续会被覆盖。
当未到第k个时,(node接收的)返回值一直是空。到第k个后,一旦返回了root,那么node就不会为空了,就一直一层层的递归出去到结束了。

代码

法一:

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/

class Solution {
public:
	TreeNode* KthNode(TreeNode* pRoot, int k)
	{
		if (pRoot == NULL || k <= 0) {//注意k=0
			return NULL;
		}
		vector<TreeNode*> vec;
		inorderTravel(pRoot,vec);
		if((size_t) k>vec.size()) {//注意
			return NULL;
		}
		return vec[k - 1];
	}

private:
	void inorderTravel(TreeNode* pRoot,vector<TreeNode*>& vec) {
		if (pRoot == NULL) {
			return;
		}
		else {
			inorderTravel(pRoot->left,vec);
			vec.push_back(pRoot);
			inorderTravel(pRoot->right,vec);
		}
	}
};
   

法二:

class Solution {
public:
	int cnt = 0;
	TreeNode* KthNode(TreeNode* pRoot, int k)
	{
		if (pRoot != nullptr) {
			TreeNode* pNode=KthNode(pRoot->left, k);
			if (pNode != nullptr) {
				return pNode;
			}
			cnt++;
			if (cnt == k) {
				return pRoot;
			}
			pNode = KthNode(pRoot->right, k);
			if (pNode != nullptr) {
				return pNode;
			}
		}
		return nullptr;
	}
};

posted on   coding_gaga  阅读(145)  评论(0编辑  收藏  举报

编辑推荐:
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
阅读排行:
· 开发的设计和重构,为开发效率服务
· 从零开始开发一个 MCP Server!
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· Ai满嘴顺口溜,想考研?浪费我几个小时
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示