总结的部分题目思路与代码,待完善。
【剑指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;
}
}
}