[18/11/28]二叉树的生成(以二叉搜索树为例)
1、思想
这里构建的二叉树是一棵二叉搜索(排序)树(BST),由于二叉排序树的中序遍历是有序的,便于观察。
(1)、首先定义节点和树的数据类型
typedef struct node{ //定义节点的数据类型
int data;
struct node* left;
struct node* right;
} Node;
typedef struct { // 定义树的数据类型
Node* root;
} Tree;
(2)、插入和生成
在二叉排序树中插入一个新元素,要保证插入后仍然满足BST性质。插入过程是:若二叉排序树Tree为空,则创建一个关键字为data的node节点,作为它的根节点;否则将data与根节点比较,若data<根节点,则插在左子树上,否则插在右子树上.
【代码示例】
1 //1、二叉树的生成(以二叉搜索(排序)树为例,中序遍历是有序的) 2 3 #include <stdio.h> 4 #include <stdlib.h> 5 6 7 typedef struct node{ //定义节点的数据类型 8 int data; 9 struct node* left; 10 struct node* right; 11 } Node; 12 13 typedef struct { // 定义树的数据类型 14 Node* root; 15 } Tree; 16 void inorder(Node* node){ //中序遍历(二叉搜索树的中序序列是有序的):左 根 右 17 if(node!=NULL){ 18 inorder(node->left); 19 printf("%-4d",node->data); //node 是节点,调用data用node->data 而非 node.data 20 inorder(node->right); 21 } 22 } 23 // | 递归模型 f(node)=0; 24 int get_height(Node* node){ //求高度 | f(node)=MAX{f(node->left),f(node->right)}+1 25 if(node==NULL){ //| 26 return 0; 27 }else{ 28 int left_height=get_height(node ->left); 29 int right_height=get_height(node ->right); 30 return (left_height > right_height)?(left_height+1):(right_height+1);//返回左右子树最大的那个,然后加1(根节点那层) 31 } 32 } 33 34 int get_max(Node* node){ //求普通二叉树的最大值 假设全是正数 (二叉搜索树的更简单,就在最右边) 35 if(node==NULL){ 36 return -1; //若节点为空,返回-1 37 }else{ 38 int left_max=get_max(node->left);//分别获取左右子树的最大值 39 int right_max=get_max(node->right); 40 int max=node->data; //获取根节点的值 41 42 int temp =(left_max>right_max)?left_max:right_max; //进行比较,返回3个数中最大的那个 43 return (temp>max)?temp:max; 44 } 45 46 } 47 48 void insert(Tree* tree,int value){ //构建二叉树 49 Node* node= malloc(sizeof(Node)); //node 是个指针 50 51 node -> data = value; //初始时根的左右子树全为空 52 node -> left = NULL; 53 node -> right = NULL; 54 55 if(tree->root == NULL){ 56 tree->root=node; //如果根节点为空(这个数是第一个数),则插入这个数 57 }else{ 58 Node* temp=tree->root; //temp:临时节点,即当前所比较的节点 59 while(temp!=NULL){ 60 if(value < temp->data){ //如果比根节点小 ,插在左子树上 61 if(temp->left==NULL){ 62 temp->left=node; 63 return; 64 }else{ 65 temp=temp->left; 66 } 67 }else{ //如果比根节点大,插入在右子树上 68 if(temp->right==NULL){ 69 temp->right=node; 70 return; 71 }else{ 72 temp=temp->right; 73 } 74 } 75 } 76 } 77 } 78 79 int main() 80 { 81 int arr[9]={3,7,8,2,5,11,9,1,6}; 82 Tree tree; 83 tree.root=NULL; 84 for(int i=0;i<9;i++){ 85 insert(&tree,arr[i]);//依次插入各个节点 86 } 87 inorder(tree.root); //中序输出 88 printf( "\nh=%-4d",get_height(tree.root) ); //输出高度 89 printf( "\nmax=%-4d",get_max(tree.root) ); //输出最大值 90 91 92 return 0; 93 }
【结果示例】