动态建二叉搜索树,并更新树高 C++版
1.需求
动态建二叉搜索树,并更新树高。
2.分析
建立二叉搜索树是很简单的。更新树高也很简单,我们只需要在插入值之后动态更新当前root的高度即可。
3.代码
#include<cstdio>
#include<iostream>
#define maxn 100
using namespace std;
int N ;
struct Node{
Node* left;
Node* right;
int data;//数值
int height;//高度
};
Node* newNode(int v){
Node* node = new Node;//构建一个新节点
node->left = NULL;
node->right = NULL;
node->data = v;//
node->height = 1;//高度为1
return node;
}
//更新节点高度
void updateHeight(Node* root){
int lh ;
int rh;
if(root->left==NULL) lh = 0;
else lh=root->left->height;
if(root->right == NULL) rh = 0;
else rh=root->right->height;
root->height = max(lh,rh)+1;
}
//插入值
void insert(Node* &root,int v){
if(root == NULL){//如果root 为NULL
root = newNode(v);
return;
}
if(v > root->data ){//进入右子树
insert(root->right,v) ;
updateHeight(root);//因为进入了右子树,所以需要更新 当前root的高度
}
else {//进入左子树
insert(root->left,v) ;
updateHeight(root);
}
}
void preOrder(Node* root){
cout << "data: "<<root->data <<",height = "<<root->height<<"\n" ;
if(root->left!=NULL) preOrder(root->left);
if(root->right!=NULL) preOrder(root->right);
}
int main(){
cin >> N;
int v;//当前需要插入的值
int i,j;
Node* root = NULL;//作为根节点
for(i = 0;i< N;i++){
cin >> v;
insert(root,v) ;
}
preOrder(root);
}
4.测试用例
5
88 70 61 96 120
7
88 70 61 96 120 90 65
5.注意点
- 如果在执行插入节点之后,一定需要动态更新树中每个受影响的节点的高度。这个是借助递归实现的。
if(v > root->data ){//进入右子树
insert(root->right,v) ;
updateHeight(root);//因为进入了右子树,所以需要更新 当前root的高度
}
else {//进入左子树
···
}
比如说,现在的树中已有的节点是88 70 61 了,在插入96的时候,就需要插入到根节点的右子树了(所以需要对根节点的高度进行更新,但是我们需要从最深处往最低处更新),所以借助递归实现。

















