二叉樹查找演算法
A. 二叉樹演算法有哪些應用場景
二叉樹常被用於實現二叉查找樹和二叉堆。
在計算機科學中,二叉樹是每個結點最多有兩個子樹的樹結構。通常子樹被稱作「左子樹」和「右子樹」。
根據不同的用途可分為:
1、完全二叉樹——若設二叉樹的高度為h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第h層有葉子結點,並且葉子結點都是從左到右依次排布,這就是完全二叉樹。
2、滿二叉樹——除了葉結點外每一個結點都有左右子葉且葉子結點都處在最底層的二叉樹。
3、平衡二叉樹——平衡二叉樹又被稱為AVL樹(區別於AVL演算法),它是一棵二叉排序樹,且具有以下性質:它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。
(1)二叉樹查找演算法擴展閱讀
深度為h的二叉樹最多有個結點(h>=1),最少有h個結點。對於任意一棵二叉樹,如果其葉結點數為N0,而度數為2的結點總數為N2,則N0=N2+1。
有N個結點的完全二叉樹各結點如果用順序方式存儲,則結點之間有如下關系為若I為結點編號則 如果I>1,則其父結點的編號為I/2。如果2*I<=N,則其左孩子(即左子樹的根結點)的編號為2*I。若2*I>N,則無左孩子。如果2*I+1<=N,則其右孩子的結點編號為2*I+1。
B. 從一棵二叉樹中查找出所有結點的最大值。
#include <stdio.h>//頭文件
#include <stdlib.h>
#include <malloc.h>
typedef struct BiTNode
{
int data;
struct BiTNode *lchild,*rchild;
}
BiTNode,*BiTree;//定義結點類型
int max=-100;//把max定義得足夠小
BiTree CreateBiTree()//先序遞歸創建樹
{
int p;BiTree T;
scanf("%d",&p);//注意每輸入兩個值的時候用空格各隔開
if(p==0)
T=NULL;
else
{
T=(BiTNode *)malloc(sizeof(BiTNode));//為結點開辟空間
T->data=p;
T->lchild=CreateBiTree();
T->rchild=CreateBiTree();
}
return (T);
}
int Max(BiTree T)//求最大(遞歸演算法)
{
if(T==NULL)
return 0;
if(T!=NULL)
{
if(T->data>max)
max=T->data;
Max(T->lchild);
Max(T->rchild);
}
return max;
}
void main()//主函數
{
BiTree Ta;
Ta=CreateBiTree();
printf("最大值是:\n");
printf("%d",Max(Ta));
}
原理很簡單,隨便通過一種遍歷(我用的是先序),先把根節點的值給max,然後在訪問其他節點的時候判斷那個值是否更大,如果是就賦值給max,最後就可以找到最大值了。
想了一下,如果用遞歸的話就不要用到棧了,這樣更簡單,如果你需要非遞歸的話可以聯系我。你不會創建樹可以聯系。
C. 急!!求C++平衡二叉樹查找的演算法
俺有~~
代碼的一部份:老師給的;代碼有點多,要的話,給我郵箱,我發給你吧!
「
#define LH 1 //左子樹高
#define EH 0 //左右子樹等高
#define RH -1 //右子樹高
enum BOOL{False,True};
typedef struct //定義記錄的結構
{int keynum; //在本程序中只含有關鍵字一項
}Record;
typedef struct BSTNode //定義平衡二叉樹節點結構
{Record data; //數據域
int bf; //平衡因子
struct BSTNode *lchild,*rchild; //左右孩子指針域
}BSTNode,*BSTree;
BSTree SearchBST(BSTree,int); //在平衡二叉排序樹中查找元素
BOOL InsertAVL(BSTree &,Record,BOOL&); //在平衡二叉排序樹中插入元素
void LeftBalance(BSTree &); //左平衡旋轉處理
void RightBalance(BSTree &); //右平衡旋轉處理
void InorderBST(BSTree); //中序遍歷二叉排序樹,即從小到大顯示各元素
void R_Rotate(BSTree &); //右旋處理
void L_Rotate(BSTree &); //左旋處理
void main()」
已經發到你郵箱里了,注意查收!!完整的程序代碼!!
D. 二叉樹演算法是什麼
二叉樹的每個結點至多隻有二棵子樹(不存在度大於2的結點),二叉樹的子樹有左右之分,次序不能顛倒。
二叉樹的第i層至多有2^(i 1)個結點;深度為k的二叉樹至多有2^k 1個結點;對任何一棵二叉樹T,如果其終端結點數為n0,度為2的結點數為n2,則n0 = n2 + 1。二叉樹演算法常被用於實現二叉查找樹和二叉堆。
二叉樹是每個節點最多有兩個子樹的有序樹。通常子樹被稱作「左子樹」(left subtree)和「右子樹」(right subtree)。二叉樹常被用於實現二叉查找樹和二叉堆。
(4)二叉樹查找演算法擴展閱讀:
二叉樹也是遞歸定義的,其結點有左右子樹之分,邏輯上二叉樹演算法有五種基本形態:
1、空二叉樹——(a)
2、只有一個根結點的二叉樹——(b);
3、右子樹為空的二叉樹——(c);
4、左子樹為空的二叉樹——(d);
5、完全二叉樹——(e)
注意:盡管二叉樹與樹有許多相似之處,但二叉樹不是樹的特殊情形。
E. 如何實現二叉樹遍歷、排序、查找(小女子急須要大俠們的幫忙~~~)
如果這部分題別人給你做的話畢業了你更哭,還小女子!BS
其實你的分給的真的很少
累傻小子呢?
F. 二叉樹如何用演算法找到某結點的所有祖先
#include<stdio.h>
typedef char DataType;
typedef struct BinTreeNode *PBinTreeNode;
struct BinTreeNode
{
DataType info; // 數據域
PBinTreeNode llink, rlink; //左右指針
};
typedef struct BinTreeNode *BTree; //表示二叉樹類型
typedef struct BinTreeNode *BNode; //表示二叉樹節點類型
BTree CreateEmptyTree() //建空二叉樹
{
BTree atree=(BTree)malloc(sizeof(struct BinTreeNode));
if(atree!=NULL)
{
atree->llink=NULL;
atree->rlink=NULL;
}
else
printf("Out of space! \n"); /*創建失敗*/
return (atree);
}
void Parent(BTree t,BNode a,BNode &p)//t為二叉樹根節點,a為目標子節點,p目標父節點
{
if(t)
{
if(t->llink == a || t->rlink == a)//a為需要查找的二叉樹節點值
{
p=t;
}
else
{
Parent(t->llink, a, p);
Parent(t->rlink,a, p);
}
}
}
BTree Insert(BTree &T,char x) //構造T->info=x,T->llink=NULL
{
T=CreateEmptyTree();
T->info = x;
T->llink= CreateEmptyTree() ;
T->rlink= CreateEmptyTree() ;
return (T);
}
int main()
{
BTree atree;
atree=CreateEmptyTree() ;
Insert(atree,'a');//atree->info='a';
Insert(atree->llink,'b');//atree->llink->info='b';
Insert(atree->llink->llink,'c');//atree->llink->llink->info='c';
Insert(atree->llink->llink->llink,'d');
Insert(atree->llink->llink->rlink,'e');
Insert(atree->llink->llink->rlink->llink,'f');
BNode x; //尋找一個點的祖先
Parent(atree,atree->llink->llink->rlink->llink, x);
printf("%c ",x->info);
BNode y=x;
while(y!=atree)
{
Parent(atree,y, x);
printf("%c ",x->info);
y=x;
}
printf("\n");
return 0;
}
G. 二叉樹基本演算法
#include <iostream.h>
typedef struct BiTNode
{
char data;
int bit;
struct BiTNode *lchild,*rchild,*parent;
}BiTNode;
void InitBT(BiTNode *&t)//1、初始化,不帶頭結點
{
t=NULL;
}
/*void InitBT(BiTNode *t)//初始化,帶頭結點
{
t=new BiTNode;
t->lchild=t->rchild=t->parent=NULL;
}*/
int EmptyBT(BiTNode *t)//判斷隊空
{
if(t==0)
return 1;
else
return 0;
}
BiTNode *creatBT(BiTNode *t,int b)//2、創建二叉樹
{
BiTNode *p;
char ch;
cin>>ch;
if(ch=='#')return 0;
else
{
p=new BiTNode;
p->data=ch;
p->parent=t;
p->bit=b;
t=p;
t->lchild=creatBT(t,0);
t->rchild=creatBT(t,1);
}
return t;
}
void preorder(BiTNode *t)//3、先序遍歷
{
if(!EmptyBT(t))
{
cout<<t->data;
preorder(t->lchild);
preorder(t->rchild);
}
}
void inorder(BiTNode *t)//中序遍歷
{
if(!EmptyBT(t))
{
inorder(t->lchild);
cout<<t->data;
inorder(t->rchild);
}
}
void postorder(BiTNode *t)//後序遍歷
{
if(!EmptyBT(t))
{
postorder(t->lchild);
postorder(t->rchild);
cout<<t->data;
}
}
void coutBT(BiTNode *t,int &m,int &n,int &i)//4、計算二叉樹中葉子結點、度為2的結點和度為1的結點的個數
{
if(!EmptyBT(t))
{
if((t->lchild==0) && (t->rchild==0))
m++;//葉子結點
else if((t->lchild!=0) && (t->rchild!=0))
i++;//度為2的結點
else
n++;//度為1的結點
coutBT(t->lchild,m,n,i);
coutBT(t->rchild,m,n,i);
}
}
void coutNode(BiTNode *t,int &k)//5、求二叉樹中結點個數
{
if(!EmptyBT(t))
{
k++;
coutNode(t->lchild,k);
coutNode(t->rchild,k);
}
}
int BTdepth(BiTNode *t)//6、求二叉樹的深度
{
int i,j;
if(EmptyBT(t))
return 0;
else
{
i=BTdepth(t->lchild);
j=BTdepth(t->rchild);
return (i>j?i:j)+1;
}
}
int Xdepth(BiTNode *t,char x)//7、查找x的層數
{
int num1,num2,n;
if(t==NULL)
return 0;
else{
if(t->data==x)
return 1;
num1=Xdepth(t->lchild,x);
num2=Xdepth(t->rchild,x);
n=num1+num2;
if(num1!=0||num2!=0)
n++;
return n;
}
}
static int flag;
void SearchChild(BiTNode *t,int k)//8、查找第k個結點的左右孩子
{
if(!EmptyBT(t))
{
if(k==0)
{
cout<<"位置不能為0!"<<endl;
return;
}
else
{
flag++;
if(flag==k)
{
if(t->lchild==0)
cout<<"無左孩子! ";
else
cout<<"左孩子為:"<<(t->lchild->data)<<" ";
if(t->rchild==0)
cout<<"無右孩子!"<<endl;
else
cout<<"右孩子為:"<<(t->rchild->data)<<endl;
}
else
{
SearchChild(t->lchild,k);
SearchChild(t->rchild,k);
}
}
}
}
int Xancestor(BiTNode *t,char x)//9、查找x結點祖先
{
int n,num1,num2;
if(t==NULL)
return 0;
else
{
if(t->data==x)
return 1;
num1=Xancestor(t->lchild,x);
num2=Xancestor(t->rchild,x);
n=num1+num2;
if(n!=0)
{
n++;
cout<<t->data<<" "<<endl;
}
}
}
void BTNodePath(BiTNode *t)//10、輸出所有葉子結點路徑
{
if(!EmptyBT(t))
{
if((t->lchild==0) && (t->rchild==0))
{
cout<<t->data<<"的路徑為:";
for(BiTNode *p=t;p!=0;p=p->parent)
cout<<p->data;
cout<<endl;
}
else
{
BTNodePath(t->lchild);
BTNodePath(t->rchild);
}
}
}
void BTNodebit(BiTNode *t)//11、輸出所有葉子結點編碼
{
if(!EmptyBT(t))
{
if((t->lchild==0) && (t->rchild==0))
{
cout<<t->data<<"的編碼為:";
for(BiTNode *p=t;p->parent!=0;p=p->parent)
cout<<p->bit;
cout<<endl;
}
else
{
BTNodebit(t->lchild);
BTNodebit(t->rchild);
}
}
}
void main()
{
BiTNode *t;
int m,n,i,d,q,k;
char x;
cout<<"1、初始化..."<<endl;
InitBT(t);
cout<<"2、創建二叉樹..."<<endl;
t=creatBT(t,0);
cout<<"3.1、先序遍歷..."<<endl;
preorder(t);
cout<<endl;
cout<<"3.2、中序遍歷..."<<endl;
inorder(t);
cout<<endl;
cout<<"3.3、後序遍歷..."<<endl;
postorder(t);
cout<<endl;
m=n=i=0;
cout<<"4、計算葉子結點,度為1的結點和度為2的結點的個數..."<<endl;
coutBT(t,m,n,i);
cout<<"葉子結點個數為:"<<m<<endl;
cout<<"度為1的結點個數為:"<<n<<endl;
cout<<"度為2的結點個數為:"<<i<<endl;
q=0;
cout<<"5、計算結點個數..."<<endl;
coutNode(t,q);
cout<<"結點個數為:"<<q<<endl;
d=0;
cout<<"6、計算深度..."<<endl;
d=BTdepth(t);
cout<<"深度為:"<<d<<endl;
cout<<"7、求x的層數..."<<endl;
cout<<"輸入x:";
cin>>x;
if(Xdepth(t,x)==0)
cout<<"x不存在!"<<endl;
else
cout<<Xdepth(t,x)<<endl;
cout<<"8、輸入要查找孩子的結點在先序遍歷中的位置k(不等於0):";
cin>>k;
SearchChild(t,k);
if(k>flag)
cout<<"位置超出長度!"<<endl;
cout<<"9、查詢結點的所有祖先,請輸入結點x:";
cin>>x;
int num;
num=Xancestor(t,x);
if(num==0)
cout<<"結點不存在!"<<endl;
if(num==1)
cout<<"根結點無祖先!"<<endl;
cout<<"10、輸出所有葉子結點路徑(葉→根):"<<endl;
BTNodePath(t);
cout<<"11、輸出所有葉子結點編碼(葉→根):"<<endl;
BTNodebit(t);
}
H. 二叉樹的性質有些啊怎麼求它的深度
二叉樹性質如下:
1 :在二叉樹的第i層上至少有2^(i-1)個結點
2:深度為k的二叉樹至多有2^(k-1)個結點
3:對任何一棵二叉樹T,如果其終端結點數為n0,度為2的結點數為n2,則n0=n2+1
4:具有n個結點的完全二叉樹的深度是【log2n】+1(向下取整)
5:如果對一棵有n個結點的完全二叉樹的結點按層序編號,則對任一結點i(1in),有:
如果i=1,則結點i是二叉樹的根,無雙親;如果i>1,則其雙親是i/2
如果2i>n,則結點i無左孩子;如果2in,則其左孩子是2i
如果2i+1>n,則結點i無右孩子;如果2i+1n,則其右孩子是2i+1
二叉樹深度演算法如下:
深度為m的滿二叉樹有2^m-1個結點;
具有n個結點的完全二叉樹的深度為[log2n]+1.(log2n是以2為底n的對數)
(8)二叉樹查找演算法擴展閱讀:
在計算機科學中,二叉樹是每個結點最多有兩個子樹的樹結構。通常子樹被稱作「左子樹」(left subtree)和「右子樹」(right subtree)。二叉樹常被用於實現二叉查找樹和二叉堆。
一棵深度為k,且有2^k-1個節點的二叉樹,稱為滿二叉樹。這種樹的特點是每一層上的節點數都是最大節點數。而在一棵二叉樹中,除最後一層外,若其餘層都是滿的,並且最後一層或者是滿的,或者是在右邊缺少連續若干節點,則此二叉樹為完全二叉樹。具有n個節點的完全二叉樹的深度為log2(n+1)。深度為k的完全二叉樹,至少有2k-1個節點,至多有2k-1個節點。
二叉樹是一個連通的無環圖,並且每一個頂點的度不大於3。有根二叉樹還要滿足根結點的度不大於2。有了根結點之後,每個頂點定義了唯一的父結點,和最多2個子結點。然而,沒有足夠的信息來區分左結點和右結點。如果不考慮連通性,允許圖中有多個連通分量,這樣的結構叫做森林。
遍歷是對樹的一種最基本的運算,所謂遍歷二叉樹,就是按一定的規則和順序走遍二叉樹的所有結點,使每一個結點都被訪問一次,而且只被訪問一次。由於二叉樹是非線性結構,因此,樹的遍歷實質上是將二叉樹的各個結點轉換成為一個線性序列來表示。
設L、D、R分別表示遍歷左子樹、訪問根結點和遍歷右子樹, 則對一棵二叉樹的遍歷有三種情況:DLR(稱為先根次序遍歷),LDR(稱為中根次序遍歷),LRD (稱為後根次序遍歷)。
I. 題目3. 平衡二叉樹演算法查找樹中某節點的時間復雜度是多少
平均查找的時間復雜度為O(log n)。
平衡樹的查找過程和排序樹的相同。在查找過程中和給定值進行比較關鍵字個數不超過樹的深度。
如果二叉樹的元素個數為n,那麼不管是對樹進行插入節點、查找、刪除節點都是log(n)次循環調用就可以了。它的時間復雜度相對於其他數據結構如數組等是最優的。
是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。常用演算法有紅黑樹、AVL、Treap、伸展樹等。
(9)二叉樹查找演算法擴展閱讀:
二叉樹也是遞歸定義的,其結點有左右子樹之分,邏輯上二叉樹演算法有五種基本形態:
(1)空二叉樹——(a)
(2)只有一個根結點的二叉樹——(b);
(3)右子樹為空的二叉樹——(c);
(4)左子樹為空的二叉樹——(d);
(5)完全二叉樹——(e)
注意:盡管二叉樹與樹有許多相似之處,但二叉樹不是樹的特殊情形。
J. 二叉樹查找和二分查找是同一演算法嗎
兩者的演算法思路其實很像:比中間的小就在剩下的左邊,大就在剩下的右邊找
但是:
二叉樹查找一般習慣是在鏈式存儲上進行,為一個樹形結構
二分查找一定在順序存儲上進行