二叉搜索树的第k个节点_牛客题霸_牛客网 (nowcoder.com)
题目内容一句话概括,就是把二叉树排序好后的节点,返回第k个节点。
思路:
遍历二叉树,由于是二叉搜索树,所以,如果按照中序输出的话,就是一个有序的节点顺序(小到大)。那么我们就按照中序输出的方式,遍历到哪个节点就给他标号,找到我们要找的号码,返回输出就行。
class Solution {
public:
int ss=0; //节点值的号码数
int nn=1; //要找的号码数
int res=-1;
void traverse(TreeNode* root)
{
if (root==nullptr) return ;
traverse(root->left);
ss++;
if (ss == nn) res = root->val; //记录下节点值
traverse(root->right);
}
int KthNode(TreeNode* proot, int k) {
nn = k;
traverse(proot);
return res;
}
};
还有另外一种方法,即用栈模拟的方式来遍历二叉树。我们先把左子树遍历完,再去把其他部分的节点进行遍历。
class Solution {
public:
int KthNode(TreeNode* proot, int k) {
if (proot==nullptr) return -1;
int nn=0; //标记每个节点的顺序
stack<TreeNode*> ss;
TreeNode* ptr = nullptr;
while (!ss.empty() || proot!=nullptr){
while (proot!=nullptr)
{
ss.push(proot); //把左子树全部入栈
proot = proot->left;
}
ptr = ss.top(); //再处理右子树(这样的顺序满足从小到达的要求)
ss.pop();
nn++;
if (nn == k) return ptr->val; //找到即返回
proot = ptr->right;
}
return -1;
}
};
二叉树的深度_牛客题霸_牛客网 (nowcoder.com)
与上题一样也有两种方法
模拟遍历与递归遍历。
直接给出代码:
class Solution {
public:
int TreeDepth(TreeNode* pRoot) {
if (pRoot==nullptr) return 0;
int depth=0;
queue<TreeNode*> que;
que.push(pRoot);
while (!que.empty())
{
int size = que.size(); //这层有几个节点
for (int i=0;i<size;i++) //进入下一层
{
TreeNode* qq = que.front(); //弹出上层节点
que.pop();
if (qq->left) que.push(qq->left);
if (qq->right) que.push(qq->right);
}
//这层搞完深度加1
depth++;
}
return depth;
}
};
下面的方法是用了回溯的思想,具体可以参考:二叉树以及多叉树一些小技巧-CSDN博客
class Solution {
public:
int res=0;
int depth=0;
void traverse(TreeNode* root)
{
if (root==nullptr) return;
depth++;
res = max(res,depth);
traverse(root->left);
traverse(root->right);
depth--;
}
int TreeDepth(TreeNode* pRoot) {
if (pRoot==nullptr) return 0;
traverse(pRoot);
return res;
}
};