【剑指offer】面试题54:二叉搜索树的第K大节点【C++版本】

总结的部分题目思路与代码,待完善。
【剑指offer-第二版】部分题目与解答【C++版本】

题目:

给定一棵二叉搜索树,请找出其中第K大的节点。
树的节点的定义为:

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

解题思路:

1.二叉搜索树的中序遍历结果是一个有序的数组,所以如果能够求得二叉搜索树的中序遍历结果,那么就可以求得其第K大的节点
2.注意中序遍历的递归和非递归方法都要掌握

可以AC的解法:使用递归【C++版本】

#include <iostream>
#include <vector>
#include <stack>
using namespace std;
struct treeNode {
       int val;
       treeNode *left;
       treeNode *right;
       treeNode(int x) :val(x), left(NULL), right(NULL) {}
};
void inorder(treeNode *root);
void inorderByStack(treeNode *root);
treeNode *inorder(treeNode *root, int &k);
treeNode* KthNode(treeNode* pRoot, int k);
int main() {
       //测试
       treeNode *root = &treeNode(5);
       treeNode *node1 = &treeNode(3);
       treeNode *node2 = &treeNode(7);
       root->left = node1;
       root->right = node2;
       treeNode *node3 = &treeNode(2);
       treeNode *node4 = &treeNode(4);
       treeNode *node5 = &treeNode(6);
       treeNode *node6 = &treeNode(8);
       node1->left = node3;
       node1->right = node4;
       node2->left = node5;
       node2->right = node6;
       int a = 4;
       treeNode * resu = KthNode(root,a);
       cout << resu->val << endl;
       system("pause");
       return 0;
}

treeNode* KthNode(treeNode* pRoot, int k)
{
     return inorder(pRoot, k);
}

//中序遍历解面试题53
treeNode *inorder(treeNode *root, int &k) {
       if (root == NULL)return NULL;
       treeNode *resu = NULL;

       resu = inorder(root->left, k);

       if (k == 1) {
              resu = root;         //真正赋值的地方只有这里
       }      
       k--;
       if(k > 0)
              resu = inorder(root->right, k);
       return resu;
}

可以AC的方法:非递归

//不使用递归
//注意只需要改动KthNode函数
treeNode* KthNode(treeNode* pRoot, int k) {
       if (pRoot == NULL)return NULL;
       treeNode *tmp = pRoot,*resu = NULL;
       stack<treeNode *> nodeStack;
       while (tmp != NULL || !nodeStack.empty()) {
              if (tmp != NULL) {
                     nodeStack.push(tmp);
                     tmp = tmp->left;
              }
              else {
                     tmp = nodeStack.top();
                     nodeStack.pop();
                     k--;
                     if (k == 0)
                           return tmp;
                     tmp = tmp->right;
              }
       }
       return NULL;
}

补充:二叉树中序遍历的递归和非递归方法

//中序遍历
void inorder(treeNode *root) {
    if (root == NULL)return;

    inorder(root->left);

    cout << root->val << endl;

    inorder(root->right);
}

//非递归的中序遍历
void inorderByStack(treeNode *root) {
    treeNode *tmp = root;

    stack<treeNode *> nodeStack;
    while (tmp != NULL || !nodeStack.empty()) {
        if (tmp != NULL) {
            nodeStack.push(tmp);
            tmp = tmp->left;
        }
        else {
            tmp = nodeStack.top();
            cout << tmp->val << endl;
            nodeStack.pop();
            tmp = tmp->right;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/m0_37950361/article/details/82024743