其实就是牛客网中《剑指offer》栏常见的树的实现方式,
看着比类写的简单,记录一下,没有太大价值。
顺带记录一下“二叉树的第k个结点”解题代码(中序递归遍历嘻嘻)。
题目描述
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。
//test
#include<iostream>
#include<vector>
using namespace std;
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
int find(TreeNode* pRoot,int k,vector<TreeNode*>& v) {
if(pRoot==NULL) {
return 0;
}
find(pRoot->left,k,v);
v.push_back(pRoot);
if(v.size()==k) {
return 0;
}
find(pRoot->right,k,v);
return 0;
}
TreeNode* KthNode(TreeNode* pRoot, int k) {
if((k<=0)||(pRoot==NULL)) { //这句很重要~
return NULL;
}
vector<TreeNode*> v;
find(pRoot,k,v);
if(v.size()<k) {
return NULL;
}
return v[k-1];
}
int main() {
TreeNode* root=new TreeNode(5);
TreeNode* a1=new TreeNode(3);
TreeNode* a2=new TreeNode(7);
TreeNode* a3=new TreeNode(2);
TreeNode* a4=new TreeNode(4);
TreeNode* a5=new TreeNode(6);
TreeNode* a6=new TreeNode(8);
root->left=a1;
root->right=a2;
a1->left=a3;
a1->right=a4;
a2->left=a5;
a2->right=a6;
for(int i=1; i<5; i++) {
cout<<KthNode(root,i)->val<<endl;
}
return 0;
}