當前位置:首頁 » 操作系統 » 二叉演算法

二叉演算法

發布時間: 2022-01-22 16:04:44

1. 二叉樹演算法是什麼

二叉樹是每個節點最多有兩個子樹的有序樹。通常子樹被稱作「左子樹」(left subtree)和「右子樹」(right subtree)。二叉樹常被用於實現二叉查找樹和二叉堆。



性質

1、在二叉樹中,第i層的結點總數不超過2^(i-1)。

2、深度為h的二叉樹最多有2^h-1個結點(h>=1),最少有h個結點。

3、對於任意一棵二叉樹,如果其葉結點數為N0,而度數為2的結點總數為N2,則N0=N2+1。


2. 二叉樹 演算法

原因就在於Status CreatBitTree(BitTree e) 這個函數的參數BitTree e,既然e是參數,因此你在函數體內用e=NULL; 及e=(BitTree)malloc(sizeof(BitNode)); 來給e賦值都是沒有用的,賦值不會返回給調用處。修改的話改成引用就可以了。也就是把Status CreatBitTree(BitTree e) 這一行改成Status CreatBitTree(BitTree &e) 就行了。

還有:二叉樹演算法遞歸中序輸入是abc##de#g##f### (你這應該是前序輸入吧?)

3. 請寫出計算二叉樹的深度的演算法

typedef struct tree//二叉樹的定義
{ char data; struct tree *lchild,*rchild; }TREE,*Tree;

void create(Tree t)//創建一棵二叉樹
{ char ch; scanf("%c",&ch); if(ch=='#') t=NULL;
else { t->data=ch; create(t->lchild); create(t->rchild); }
}
int deep(Tree t)//深度演算法
{ if(!t) return 0; else { ld=deep(t->lchild); rd=deep(t->rchild);
if(ld>rd) return rd+1; else return ld+1;
}
void main()//主函數
{ Tree t; create(t); printf("%d\n",deep(t)); }

4. 二叉樹結點的演算法

一個結點的度是指該結點的子樹個數。
度為1就是指只有1個子樹(左子樹或者右子樹)。
度為2的結點個數=葉結點個數-1=69
該二叉樹的總結點數=70+80+69=219

5. 二叉樹演算法如何學習

理解是關鍵,多看書,有條件上機,對理解有幫助,慢慢就會了!!!
加油啊!!!

6. 建立二叉樹的二叉鏈表演算法

CreateBinTree(BiTree *T) *T 是一個指針, 指向T 。 輸入 0 不就退出了。不過需要多輸入幾次。

7. 編寫一個遞歸演算法,將二叉鏈表表示的二叉樹,判斷兩個二叉樹是否相同的演算法

判斷二叉樹是否為完全二叉樹。完全二叉樹的定義是,前n-1層都是滿的,第n層如有空缺,則是缺在右邊,即第n層的最右邊的節點,它的左邊是滿的,右邊是空的。以3層二叉樹為例,以下情況為完全二叉樹:[方法一]這個問題的描述已經提示了解法,採用廣度優先遍歷,從根節點開始,入隊列,如果隊列不為空,循環。遇到第一個沒有左兒子或者右兒子的節點,設置標志位,如果之後再遇到有左/右兒子的節點,那麼這不是一顆完全二叉樹。這個方法需要遍歷整棵樹,復雜度為O(N),N為節點的總數。//二叉樹結點定義typedefstructNode{intdata;structNode*left;structNode*right;}Node;//實現廣度遍歷需要隊列Queuequeue;//第n層最右節點標志boolleftMost=false;boolProcessChild(Node*child){if(child){if(!leftMost){queue.push(child);}else{returnfalse;}}else{leftMost=true;}returntrue;}boolIsCompleteBinaryTree(Node*root){//空樹也是完全二叉樹if(!root)returntrue;//首先根節點入隊列queue.push(root);while(!queue.empty()){Node*node=queue.pop();//處理左節點if(!ProcessChild(node->left))returnfalse;//處理右節點if(!ProcessChild(node->right))returnfalse;}//廣度優先遍歷完畢,此乃完全二叉樹returntrue;}[方法二]根據完全二叉樹的定義,左邊的深度>=右邊的深度。從根節點開始,分別沿著最左最右分支下去,找到最左和最右的深度。如果左邊比右邊深1,再分別檢查以左兒子和右兒子為根的兩根樹。有點遞歸的感覺了。[Tobecontinued]

8. 二叉樹的演算法

用棧來實現。

9. 二叉樹深度的演算法

#include"stdio.h"
#include"alloc.h"
typedef
char
datatype;
typedef
struct
node
{
datatype
data;
struct
node
*lchild,
*rchild;
}
bitree;
int
k
=
1;
bitree
*Q[10];
bitree
*CREAT()
{
char
ch;
int
front,
rear;
bitree
*root,
*s;
root
=
NULL;
front
=
1;
rear
=
0;
printf("\n
=======二叉樹的建立和遍歷=======\n");
printf("
請輸入字元:
");
ch
=
getchar();
while
(ch
!=
'$')
{
s
=
NULL;
if
(ch
!=
'@')
{
s
=
malloc(sizeof(bitree));
s
->
data
=
ch;
s
->
lchild
=
NULL;
s
->
rchild
=
NULL;
}
rear++;
k
=
k++;
Q[rear]
=
s;
if
(rear
==
1)
root
=
s;
else
{
if
(s
&&
Q[front])
if
(rear
%
2
==
0)
Q[front]
->
lchild
=
s;
else
Q[front]
->
rchild
=
s;
if
(rear
%
2
==
1)
front++;
}
ch
=
getchar();
}
return
root;
}
int
COUNTER(t)
bitree
*t;
{
if
(t
==
NULL)
return
0;
else
if
(t->lchild
!=
NULL
&&
t->rchild
==
NULL
||
t->lchild
==
NULL
&&
t->rchild
!=
NULL)
return
1;
else
return
COUNTER(t->lchild)
+
COUNTER(t->rchild);
}
main()
{
int
i;
bitree
*p;
p
=
CREAT();
printf("
建立的二叉樹為:
");
for
(i
=
0;
i
<
k;
i++)
{
printf("%c
",
Q[i]
->
data);
}
printf("\n
度為1的節點數為:
");
printf("%d
",
COUNTER(p));
}
這是二叉樹的建立
遍歷
加二叉樹的度為1的結點的演算法

10. 二叉排序演算法的實現

#include<iostream>
#include<deque>
#include<algorithm>
using namespace std;

struct BinaryNode
{
char ch;//數據域
BinaryNode *leftChild;//左子節點
BinaryNode *rightChild;//右子節點
BinaryNode(BinaryNode *left=NULL,BinaryNode *right=NULL)
{
rightChild=right;
leftChild=left;
}
BinaryNode(char chz,BinaryNode *left=NULL,BinaryNode *right=NULL)
{
ch=chz;
leftChild=left;
rightChild=right;
}
};

class BinaryTree
{
private:
BinaryNode *root; //根節點
char ref;
void preOrder(BinaryNode *p); //前序遍歷
void levelOrder(BinaryNode *p); //層序遍歷
void CreateTree(BinaryNode *&p); //根據前序遍歷建立二叉樹
void deleteTree(BinaryNode *p); //釋放二叉樹
BinaryNode* CreateBinary(char *VLR,char *LVR,int preStart,int inStart,int n); //根據二叉樹的前序遍歷和中序遍歷建立二叉樹
public:
BinaryTree(){root=NULL;ref='#';} //建立空二叉樹
~BinaryTree(); //析構函數
void preOrder(); //前序遍歷
void levelOrder(); //層序遍歷
void CreateTree(); //根據前序遍歷建立二叉樹
void CreateBinary(char *VLR,char *LVR,int n); //用二叉樹的前序遍歷與後序遍歷建立二叉樹

};

void BinaryTree::deleteTree(BinaryNode *p)
//私有函數,釋放二叉樹
{
if(p!=NULL)
{
deleteTree(p->leftChild);
deleteTree(p->rightChild);
delete p;
}
}

BinaryTree::~BinaryTree() //析構函數
{
deleteTree(root);
}

void BinaryTree::preOrder(BinaryNode *p) //私有函數,前序遍歷
{
if(p!=NULL)
{
cout<<p->ch<<" ";
preOrder(p->leftChild);
preOrder(p->rightChild);
}
}

void BinaryTree::preOrder() //前序遍歷
{
preOrder(root);
}

void BinaryTree::levelOrder(BinaryNode *p) //私有函數,層序遍歷
{
deque<BinaryNode*> level; //利用隊列實現
BinaryNode *q=NULL;
if(p!=NULL)
{
level.push_back(p);
}
while(!level.empty())
{
q=level.front();
cout<<q->ch<<" ";
level.pop_front();
if(q->leftChild!=NULL)
level.push_back(q->leftChild); //左子樹入隊列
if(q->rightChild!=NULL)
level.push_back(q->rightChild); //右子樹入隊列
}
}

void BinaryTree::levelOrder() //層序遍歷
{
levelOrder(root);
}

void BinaryTree::CreateTree(BinaryNode *&p) //引用型參數的的用法*&p
{
char item;
cout<<"請輸入節點值: ";
cin>>item;
if(item!=ref) //結束標記ref
{
p=new BinaryNode(item);
CreateTree(p->leftChild); //遞歸建立左子樹
CreateTree(p->rightChild); //遞歸建立右子樹
}
else
p=NULL;
}

void BinaryTree::CreateTree()
{
CreateTree(root);
}

BinaryNode* BinaryTree::CreateBinary(char* VLR,char* LVR,int preStart,int inStart,int n) //私有函數,利用二叉樹的前序遍歷與中序遍歷建立二叉樹
{
BinaryNode *p=NULL;
if(n>0)
{
char elem=VLR[preStart];
p=new BinaryNode(elem);
int i=0;
while(i<n&&elem!=LVR[inStart+i])
i++;
p->leftChild=CreateBinary(VLR,LVR,preStart+1,inStart,i);
p->rightChild=CreateBinary(VLR,LVR,preStart+i+1,inStart+i+1,n-i-1);
}
return p;

}

void BinaryTree::CreateBinary(char *VLR,char *LVR,int n) //利用二叉樹的前序遍歷與中序遍歷建立二叉樹
{
root=CreateBinary(VLR,LVR,0,0,n);
}
int main()
{
BinaryTree tree;
tree.CreateTree();
cout<<"該二叉樹的前序遍歷為: ";
tree.preOrder();
cout<<endl;
cout<<"該二叉樹的層遍序歷為: ";
tree.levelOrder();
cout<<endl;
return 0;

}

熱點內容
緩存行原理 發布:2024-11-14 13:08:56 瀏覽:431
簡單的vb編程 發布:2024-11-14 13:06:45 瀏覽:522
綠色linux 發布:2024-11-14 12:56:11 瀏覽:349
游戲本緩存 發布:2024-11-14 12:55:28 瀏覽:649
微軟提供的編譯軟體 發布:2024-11-14 12:55:16 瀏覽:17
長沙java培訓機構哪家好 發布:2024-11-14 12:40:53 瀏覽:229
外存儲器硬碟能存儲的高清電影數 發布:2024-11-14 12:33:23 瀏覽:265
python分號作用 發布:2024-11-14 12:31:50 瀏覽:224
方舟編譯器下載要錢嗎 發布:2024-11-14 12:29:20 瀏覽:62
jspoa源碼 發布:2024-11-14 12:21:31 瀏覽:420