二叉演算法
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;
}
