[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 }

【结果示例】

 

posted @ 2018-11-28 17:32  ID长安忆  阅读(1138)  评论(0)    收藏  举报