下载麻将游戏免费|手机麻将游戏

二叉排序樹的判斷

飛來科技  發布時間:2019-08-24 05:06:39

本文關鍵詞:判斷二叉排序樹

排序二叉樹的遍歷_平衡二叉樹的判斷_判斷二叉排序樹

題目說明:

供選擇的答案: a:①是特殊的樹②不是樹的特殊方式③是兩棵樹的總稱④是只有二個根節點的樹狀結構 b:①左子結點②右子結點③左子結點或者沒有右子結點 ④兄弟 c~d: ①最左子結點②最右子結點③最鄰近的右兄弟④最鄰近的左兄弟⑤最左的兄弟⑥最右的兄弟e:①o(n)②o(n)③o(log2n)④o(log2n) 15、每一棵樹都能唯一地轉化為它所對應的二叉樹,樹的這種二叉樹表示對樹的運算帶來巨大的好處。二叉搜索樹, 則必滿足對樹中任一非葉結點, 其左子樹都小于該節點值, 右子樹所有結點值都大于該節點值。這里要留意堆和上面說的二叉搜索樹的用處,二叉搜索樹中所有結點的左子節點關鍵字都小于右子節點關鍵字,在二叉搜索樹中借助一個簡單的算法就可以按序數組節點。

#include<stdio.h>

typedef struct Tnode

{

int data; /*輸入的數據*/

struct Tnode *lchild,*rchild; /*結點的左右指針,分別指向節點的左右孩子*/

}*node,BSTnode;

searchBST(node t,int key,node f,node *p) /*查找函數*/

{

if(!t) {*p=f;return (0);} /*查找不成功*/

else if(key==t->data)

{

*p=t;return (1);

} /*查找成功*/

else if(key<t->data)

searchBST(t->lchild,key,t,p); /*在左子樹中繼續查找*/

else

searchBST(t->rchild,key,t,p);/*在右子樹中繼續查找*/

}

insertBST(node *t,int key) /*插入數組*/

{

node p=NULL,s=NULL;

if(!searchBST(*t,key,NULL,&p)) /*查找不成功*/

{

s=(node)malloc(sizeof(BSTnode));

s->data=key;

s->lchild=s->rchild=NULL;

if(!p) *t=s; /*被插結點*s為新的根結點*/

else if(key<p->data) p->lchild=s;/*被插結點*s為左孩子*/

else p->rchild=s;/*被插結點*s為右孩子*/

return (1);

}

else return (0);/*樹中已有關鍵字相同的節點,不再插入*/

平衡二叉樹的判斷_排序二叉樹的遍歷_判斷二叉排序樹

}

inorderTraverse(node *t) /*中序遍歷函數*/

{

if(*t)

{

if(inorderTraverse(&(*t)->lchild)) /*中序遍歷根的左子樹*/

{

printf("%d ",(*t)->data);/*輸出根結點*/

4 樹:樹和森林的概念及其表示判斷二叉排序,二叉樹,二叉樹性質,二叉樹表示,二叉樹遍歷與樹游標, lvr, lrv, vlr,中序游標,按層次遍歷,滿足性問題,線索二叉樹,線索,中序遍歷線索二叉樹,將節點插入線索二叉樹,選擇樹,勝者樹,敗者樹,森林的二叉樹表示及遍歷,集合表示,并查集,在等價類問題中的應用。第4章 樹:樹和森林的概念及其表示,二叉樹,二叉樹性質,二叉樹表示,二叉樹遍歷與樹游標, lvr, lrv, vlr,中序游標,按層次遍歷,線索二叉樹,線索判斷二叉排序樹,中序遍歷線索二叉樹,將節點插入線索二叉樹,選擇樹,勝者樹,敗者樹,森林的二叉樹表示及遍歷。昨天看了一下關于樹中的面試題,發現二叉樹中的面試題比較常用的例題大概有以下幾個:創建一顆二叉樹(先序,中序,后序)、遍歷一顆二叉樹(先序,中序,后序和層次遍歷)、求二叉樹中葉子結點的個數、求二叉樹的高度、求二叉樹中兩個節點的最近公共祖先、打印和為某一值。

}

}

else return(1);

}

calculateASL(node *t,int *s,int *j,int i)/*計算平均查找長度*/

{

if(*t)

{ i++; /*i記錄當前節點的在當前樹中的深度*/

*s=*s+i; /*s記錄已遍歷過的點的深度之和*/

if(calculateASL(&(*t)->lchild,s,j,i)) /*計算左子樹的ASL*/

{

(*j)++; /*j記錄樹中節點的數量*/

if(calculateASL(&(*t)->rchild,s,j,i)) /*計算右子樹的ASL*/

{i--; return(1);}

}

}

else return(1);

}

node Delete(node t,int key) /*刪除數組*/

{

node p=t,q=NULL,s,f;

while(p!=NULL) /*查找要刪除的點*/

{

if(p->data==key) break;

q=p;

平衡二叉樹的判斷_判斷二叉排序樹_排序二叉樹的遍歷

if(p->data>key)

p=p->lchild;

else

p=p->rchild;

}

if(p==NULL)

return t; /*查找失敗*/

if(p->lchild==NULL) /*p指向當前要刪除的節點*/

{

if(q==NULL)

t=p->rchild; /*q指向要刪結點的父母*/

else if(q->lchild==p)

q->lchild=p->rchild; /*p為q的左孩子*/

else

q->rchild=p->rchild;/*p為q的右孩子*/

free(p);

}

else{ /*p的左孩子不為空*/

f=p;

s=p->lchild;

while(s->rchild)/*左拐后向右走到底*/

{

f=s;

s=s->rchild;

}

if(f==p)

f->lchild=s->lchild; /*重接f的左子樹*/

else

f->rchild=s->lchild; /*重接f的右子樹*/

p->data=s->data;

free (s);

}

return t;

}

判斷二叉排序樹_平衡二叉樹的判斷_排序二叉樹的遍歷

int balanceBST(node t,int *i) /*判斷是否為平衡二叉樹的變量*/

{

int dep1,dep2;

if(!t) return(0);

else

{

dep1=balanceBST(t->lchild,i);

dep2=balanceBST(t->rchild,i);

}

if((dep1-dep2)>1||(dep1-dep2)<-1)

*i=dep1-dep2;/*用i值記錄能否存在不平衡現象*/

if(dep1>dep2) return(dep1+1);

else return(dep2+1);

}

void main()

{

node T=NULL;

int num;

int s=0,j=0,i=0;

int ch=0;

node p=NULL;

printf("please input a list of numbers end with zero:");

do

{

scanf("%d",&num);

if(!num)

printf("you have finished your input!\n");

else insertBST(&T,num);

}while(num);

printf("\n\n---The menu of the operation---\n\n"); /*主程序菜單*/

printf("0: exit\n");

printf("1: inorder travel the tree\n");

printf("2: the average search length for the tree\n");

printf("3: delete\n");

判斷二叉排序樹_平衡二叉樹的判斷_排序二叉樹的遍歷

printf("4: judge the balance\n");

while(ch==ch)

{

printf("choose the opperation to continue:");

scanf("%d",&ch);

switch(ch){

case 0: exit(0); /*0--退出*/

case 1: printf("The result of the inorder traverse is:\n");

inorderTraverse(&T);/*1--中序遍歷*/

break;

case 2: s=0;j=0;i=0;

calculateASL(&T,&s,&j,i);/*2--計算平均查找長度*/

printf(" ASL=%d/%d",s,j);

break;

case 3: printf("Please input the number you want to delete:");

scanf("%d",&num);/*3--刪除某個結點*/

if(searchBST(T,num,NULL,&p))

{

T=Delete(T,num);

printf("You have delete the number successfully!\n");

inorderTraverse(&T);

}

else printf(" No node %d you want to delete!",num);

break;

case 4: i=0;

balanceBST(T,&i);/*判斷是否為平衡二插樹*/

if(i==0)

printf("OK!The tree is a balanced tree!");

else

printf(" NO!");

break;

default: printf("Your input is wrong!please input again!\n");

break; /*輸入無效字符*/

}

printf("\n");

}

}

本文來自互聯網,由機器人自動采編,文章內容不代表本站觀點,請讀者自行辨別信息真偽,如有發現不適內容,請及時聯系站長處理。

    相關閱讀
    下载麻将游戏免费 安徽时时计划 真金发4张牌在抢庄的牛牛 北京pk10六码稳赢技巧 后三组选包胆 快速时时开奖网址 贝贝游戏通比牛牛技巧 六特三肖六码3肖6码网站 时时彩技巧软件 时时彩总和大小秘密 天津时时开奖结果记录表