您好,登錄后才能下訂單哦!
指定一個數據為二叉樹的根,向二叉樹中插入數據,(樹的第一層)如果要插入的數據比樹根的數據大,則放在該結點的右側,如果要插入的數據比樹根小,則放在該結點的左側,(樹的第二層)數據的存放規則與上面的一致。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//創建結構體
typedef struct tree
{
int a;//存放數據
struct tree *l;//二叉樹節點的左指針
struct tree *r;//二叉樹節點的右指針
}r;
//聲明一個插入函數s是二叉樹的頭節點,t是要插入到樹中的節點
void cmp(r *s,r* t);
//創建節點的函數
r *creat()
{
r * s = (r *)malloc(sizeof(r));
if(NULL != s)
memset(s,0,sizeof(r));
return s;
}
//采用遞歸遍歷的形式訪問樹中的每個節點,然后free
void destroy(r *r)
{
if(NULL == r)
return ;
destroy(r->l);
destroy(r->r);
free(r);//遞歸函數調用進行釋放內存
}
//顯示樹中每個節點的數據
void show(r *r)
{
if(NULL == r)
return ;
look(r->l);
look(r->r);
printf("%d\t",r->a);//后續遍歷
}
//向樹中插入元素,s是樹的根節點,t是要插入樹中的節點
void insert(r *s,r* t)
{
if(t->a < (s->a) && s->l == NULL)//如果新節點中的樹大于根節點中的樹,并且根節點的左指針是NULL
{
s->l = t;//直接將該指針連接到根的左指針上
return ;//節點被連接到樹上后就退出
}else if( t->a < (s->a) && NULL != s->l)//如果新節點中的樹大于根節點中的樹,并且根節點的左指針不是NULL
{
insert(s->l,t);//繼續調用函數
}
if( t->a >= (s->a) && s->r == NULL)//如果新節點中的樹小于根節點中的樹,并且根節點的右指針是NULL
{
s->r = t;//直接將該指針連接到根的右指針上
return ;//節點被連接到樹上后就退出
}else if(t->a >= (s->a ) && NULL != s->r)//如果新節點中的樹小于根節點中的樹,并且根節點的右指針不是NULL
{
insert(s->r,t);//繼續調用函數直到將結點掛到該樹上
}
}
void main()
{
r * root = creat();//創建根節點
root->a = 8;//給根節點一個初始值8
int s = 0;
while(1)
{
scanf("%d",&s);//鍵盤錄入數據,然后將這些數據插入到樹中
if(s == -1)//當輸入-1時,結束輸入
break;
r * pnew =creat();//對輸入的每個數創建節點
pnew->a = s;//將輸入的數賦值給創建的節點
insert(root,pnew);//將該節點插入進樹中
}
show(root);//后續遍歷書中所有的元素
destroy(root);//釋放該樹中所有的節點
}
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。