『壹』 二叉樹c語言演算法,急!!!!
清華大學
嚴蔚敏
的<數據結構里>都有完整的代碼,解釋的也很清楚
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
typedef
struct
tree
{
struct
tree
*left;
int
date;
struct
tree
*right;
}treenode,*b_tree;
///////插入節點/////////////////////
b_tree
insert(b_tree
root,int
node)
{
b_tree
newnode;
b_tree
currentnode;
b_tree
parentnode;
newnode=(b_tree)malloc(sizeof(treenode));
newnode->date=node;
newnode->right=NULL;
newnode->left=NULL;
if(root==NULL)
return
newnode;
else
{
currentnode=root;
while(currentnode!=NULL)
{
parentnode=currentnode;
if(currentnode->date>node)
currentnode=currentnode->left;
else
currentnode=currentnode->right;
}
if(parentnode->date>node)
parentnode->left=newnode;
else
parentnode->right=newnode;
}
return
root;
}
//////建立樹///////////////////
b_tree
creat(int
*date,int
len)
{
b_tree
root=NULL;
int
i;
for(i=0;i<len;i++)
root=insert(root,date[i]);
return
root;
}
//////中序列印////////////////
void
print1(b_tree
root)
{if(root!=NULL)
{
print1(root->left);
printf("%d->",root->date);
print1(root->right);
}
}
//////後序列印////////////////
void
print2(b_tree
root)
{if(root!=NULL)
{
print2(root->left);
print2(root->right);
printf("%d->",root->date);
}
}
//////前序列印////////////////
void
print3(b_tree
root)
{if(root!=NULL)
{
printf("%d->",root->date);
print3(root->left);
print3(root->right);
}
}
//////////在二叉樹中查找給定關鍵字
////////////
b_tree
lookfor(b_tree
root,int
e)
{
b_tree
p1,p2;
if(root!=NULL)
{
if(root->date==e)
return
root;
else
p1=lookfor(root->left,e);
p2=lookfor(root->right,e);
if(p1!=NULL)
return
p1;
else
if(p2!=NULL)
return
p2;
else
return
NULL;
}
else
return
NULL;
}
///////測試函數//////////////////
void
main()
{
b_tree
root=NULL;
int
i,index;
int
value;
int
nodelist[20];
cout<<"輸入樹的節點,輸入0結束\n";
index=0;
cin>>value;
while(value!=0)
{
nodelist[index]=value;
index=index+1;
cin>>value;
}
root=creat(nodelist,index);
printf("\n中序列印\n");
print1(root);
printf("\n後序列印\n");
print2(root);
printf("\n前序列印\n");
print3(root);
printf("\n查找的詞:\n");
int
a;
scanf("%d",&a);
b_tree
p3=lookfor(root,a);
if(p3!=NULL)
printf("%d\n",p3->date);
else
printf("沒你要找的詞");
}
『貳』 C語言二叉樹遍歷查找問題
二叉樹的遍歷分為以下三種:
先序遍歷:遍歷順序規則為【根左右】
中序遍歷:遍歷順序規則為【左根右】
後序遍歷:遍歷順序規則為【左右根】
什麼是【根左右】?就是先遍歷根,再遍歷左孩子,最後遍歷右孩子;
舉個例子,看下圖:
先序遍歷:ABCDEFGHK
中序遍歷:BDCAEHGKF
後序遍歷:DCBHKGFEA
以中序遍歷為例:
中序遍歷的規則是【左根右】,我們從root節點A看起;
此時A是根節點,遍歷A的左子樹;
A的左子樹存在,找到B,此時B看做根節點,遍歷B的左子樹;
B的左子樹不存在,返回B,根據【左根右】的遍歷規則,記錄B,遍歷B的右子樹;
B的右子樹存在,找到C,此時C看做根節點,遍歷C的左子樹;
C的左子樹存在,找到D,由於D是葉子節點,無左子樹,記錄D,無右子樹,返回C,根據【左根右】的遍歷規則,記錄C,遍歷C的右子樹;
C的右子樹不存在,返回B,B的右子樹遍歷完,返回A;
至此,A的左子樹遍歷完畢,根據【左根右】的遍歷規則,記錄A,遍歷A的右子樹;
A的右子樹存在,找到E,此時E看做根節點,遍歷E的左子樹;
E的左子樹不存在,返回E,根據【左根右】的遍歷規則,記錄E,遍歷E的右子樹;
E的右子樹存在,找到F,此時F看做根節點,遍歷F的左子樹;
F的左子樹存在,找到G,此時G看做根節點,遍歷G的左子樹;
G的左子樹存在,找到H,由於H是葉子節點,無左子樹,記錄H,無右子樹,返回G,根據【左根右】的遍歷規則,記錄G,遍歷G的右子樹;
G的右子樹存在,找到K,由於K是葉子節點,無左子樹,記錄K,無右子樹,返回G,根據【左根右】的遍歷規則,記錄F,遍歷F的右子樹;
F的右子樹不存在,返回F,E的右子樹遍歷完畢,返回A;
至此,A的右子樹也遍歷完畢;
最終我們得到上圖的中序遍歷為BDCAEHGKF,無非是按照遍歷規則來的;
根據「中序遍歷」的分析,相信先序遍歷和後序遍歷也可以輕松寫出~
『叄』 C語言實現二叉搜索
這東西很多的這里給你一個#include
#include
typedef struct np{
int dat;
struct np *left,*right;
} node;
node *create(void)
{
return (malloc(sizeof(node)));
}
node *t(node *a,int d)
{
if (a==NULL) {
a=create();
a->left =a->right =NULL;
a->dat=d;
}
else if (d>=a->dat) {
a->right =t(a->right,d);
}
else if (ddat) {
a->left =t(a->left ,d);
}
return a;
}
void inorder(node *r)
{
if (r!=NULL) {
inorder(r->left );
printf("%d ",r->dat );
inorder(r->right );
}
}
int ser(node *so,int a)
{
if (so==NULL)
return 0;
else if (so->dat==a)
return 1;
else if (a>so->dat)
return ser(so->right,a);
else if (adat)
return ser(so->left ,a);
}
int main(int argc, char* argv[])
{
node *bst=NULL;
FILE *fp;
int i;
fp=fopen("c:\\dat.txt","r"); /*假設數據文件是c:\dat.txt*/
while (!feof(fp)){
fscanf(fp,"%d",&i);
bst=t(bst,i); /*生成二叉排序樹*/
}
fclose(fp);
inorder(bst); /*輸出二叉排序樹*/
putchar('\n');
scanf("%d",&i); /*輸入需要查找的數字*/
if (ser(bst,i)) printf("YES"); /*如果找到,則輸出yes,否則輸出no*/
else printf("NO");
return 0;
}
//-
『肆』 二叉查找樹的插入-C語言實現
father有可能是空指針
『伍』 C語言 二叉樹 遞歸查找演算法
你的if(T->data==x)後面的{}裡面沒有返回,導致不能及時推出
望採納,謝謝
『陸』 數據結構c語言習題。編寫一個函數以二叉查找樹T和兩個有序的關鍵字 k1,
//創建二叉樹的原數組數據:40206010305070
//前序遍歷序列:40201030605070
//中序遍歷序列:10203040506070
//後序遍歷序列:10302050706040
//輸入關鍵字k1,k2的數值:3050
//列印的結果:
//403050
//
//二叉樹示意圖:
//
//40
///
//2060
////
//10305070
#include"stdio.h"
#include"stdlib.h"
structTree
{
intdata;
structTree*left;
structTree*right;
};
typedefstructTreeTreeNode;
typedefTreeNode*Bitree;
BitreeinsertNode(Bitreeroot,intdata)//插入結點
{
Bitreenewnode;
Bitreecurrent;
Bitreeback;
newnode=(Bitree)malloc(sizeof(TreeNode));
if(newnode==NULL)
{
printf(" 動態分配內存出錯. ");
exit(1);
}
newnode->data=data;
newnode->left=NULL;
newnode->right=NULL;
if(root==NULL)
{
returnnewnode;
}
else
{
current=root;
while(current!=NULL)
{
back=current;
if(current->data>data)
current=current->left;
else
current=current->right;
}
if(back->data>data)
back->left=newnode;
else
back->right=newnode;
}
returnroot;
}
BitreecreateTree(int*data,intlen)//創建二叉樹(非遞歸)
{
Bitreeroot=NULL;
inti;
for(i=0;i<len;i++)
{
root=insertNode(root,data[i]);
}
returnroot;
}
voidpreOrder(Bitreeptr)//先序遍歷(遞歸法)
{
if(ptr!=NULL)
{
printf("%d",ptr->data);
preOrder(ptr->left);
preOrder(ptr->right);
}
}
voidinOrder(Bitreeptr)//中序遍歷(遞歸法)
{
if(ptr!=NULL)
{
inOrder(ptr->left);
printf("%d",ptr->data);
inOrder(ptr->right);
}
}
voidpostOrder(Bitreeptr)//後序遍歷(遞歸法)
{
if(ptr!=NULL)
{
postOrder(ptr->left);
postOrder(ptr->right);
printf("%d",ptr->data);
}
}
//根據關鍵字k1和k2,進行區間查找(遞歸法)
voidbtreeSearch(Bitreeptr,intk1,intk2)
{
if(ptr!=NULL)
{
if(ptr->data<k1&&ptr->data<k2)
{
btreeSearch(ptr->right,k1,k2);
}
elseif(ptr->data==k1&&ptr->data<k2)
{
printf("%d",ptr->data);
btreeSearch(ptr->right,k1,k2);
}
elseif(ptr->data>k1&&ptr->data<k2)
{
printf("%d",ptr->data);
btreeSearch(ptr->left,k1,ptr->data);
btreeSearch(ptr->right,ptr->data,k2);
}
elseif(ptr->data>k1&&ptr->data==k2)
{
printf("%d",ptr->data);
btreeSearch(ptr->left,k1,k2);
}
elseif(ptr->data>k1&&ptr->data>k2)
{
btreeSearch(ptr->left,k1,k2);
}
elseif(ptr->data==k1&&ptr->data==k2)
{
printf("%d",ptr->data);
}
else
{
printf("其它情況,當前節點的數值是%d",ptr->data);
}
}
}
intmain()
{
BitreeT=NULL;//T是二叉查找樹
intdata[]={40,20,60,10,30,50,70};
intlen;
inti;
intk1,k2;//關鍵字k1,k2
inttmp;
len=sizeof(data)/sizeof(int);
printf("創建二叉樹的原數組數據:");
for(i=0;i<len;i++)
{
printf("%d",data[i]);
}
T=createTree(data,len);//創建二叉樹
printf(" 前序遍歷序列:");
preOrder(T);
printf(" 中序遍歷序列:");
inOrder(T);
printf(" 後序遍歷序列:");
postOrder(T);
printf(" 輸入關鍵字k1,k2的數值:");
scanf("%d%d",&k1,&k2);
if(k1>k2)
{
tmp=k1;
k1=k2;
k2=tmp;
}
//根據關鍵字k1和k2,進行區間查找(遞歸法)
btreeSearch(T,k1,k2);
printf(" ");
return0;
}