tree.h
#ifndef tree_h
#define tree_h
#include typedef int element;
/*定義二叉樹*/
typedef struct nodetreenode;
void preorder(treenode *root);//遞迴前序遍歷
void inorder(treenode *root);//遞迴中序遍歷
void postorder(treenode *root);//遞迴後序遍歷
void iterationpreorder(treenode *root);//迭代前序遍歷
void iterationinorder(treenode *root);//迭代中序遍歷
void iterationpostorder(treenode *root);//迭代後序遍歷(方法一):具體思路見cpp中解釋
void iterationpostorder2(treenode *root);//迭代後序遍歷(方法二)
void iterationpostorder3(treenode *root);//迭代後序遍歷(方法三,設定標誌位)
void levelorder(treenode *root);//層序遍歷
int printtreeatlevel(treenode *root,int level);//列印樹的第level(根節點為第0層)層所有結點,成功返回1
int treedepth(treenode *root);//返回二叉樹的深度,空樹深度為0;
void releasetree(treenode* root);//遞迴釋放整個樹
//void printtreebylevel(treenode *root);//按層序遍歷,每層之後
/*b樹的查詢,查詢成功返回1,查詢失敗返回0,類似於二分查詢分為遞迴和非遞迴*/
int searchbitree(treenode *root, element key);//非遞迴
int searchbitree2(treenode *root, element key);//遞迴
//查詢b樹最小結點
treenode * bitreeminimum(treenode *root);
//查詢b樹最大結點
treenode* bitreemaximum(treenode *root);
/*在b樹root中查詢元素item是否存在,若存在返回0,若不存在,
把item結點插入到當前結點的左指標或右指標上,並返回1*/
int insertbitree(treenode ** root,element item);
//b樹的刪除操作
void deletebitree(treenode* root,element key);
bool deletebst(treenode *root, element key);
bool delete(treenode* p);
//★★★★★★★遞迴的本質是編譯器生成乙個函式呼叫的棧
#endif
tree.cpp
#include #include #include using namespace std;
#include "tree.h"
int searchbitree(treenode *root, element key)
else if(p->data < key)else
}return 0;
}int searchbitree2(treenode *root, element key)
else if(p->data < key)else
}treenode * bitreeminimum(treenode *root)
treenode* bitreemaximum(treenode *root)
int insertbitree(treenode ** root,element item)
parent =current;//記錄查詢到的最後結點,新結點作為該結點的兒子結點
if(current->data < item)else
}//查詢失敗,插入
p=(treenode*)malloc(sizeof(treenode));//無free
if(p==null)
p->data=item;
p->leftchild=null;
p->rightchild=null;
if(parent==null)
*root = p;
else if(parent->data > item)else
return 1;
}void deletebitree(treenode* root,element key)//測試有誤
if(p->data > key)
deletebitree(p->leftchild,key);
else if(p->data < key)
deletebitree(p->rightchild,key);
elseelse
}}void preorder(treenode *root)
}void inorder(treenode *root)
}void postorder(treenode *root)
}void iterationpreorder(treenode *root)
}void iterationinorder(treenode *root)
if(!stk.empty())//棧不為空
else
}}void iterationpostorder(treenode *root)//繼續學習
else
} }void iterationpostorder2(treenode *root)//繼續學習
elseelse
}
}
}void iterationpostorder3(treenode *root)//設定標誌位
void levelorder(treenode *root)
while(!que.empty())
}int printtreeatlevel(treenode *root,int level)
return printtreeatlevel(p->leftchild,level-1) + printtreeatlevel(p->rightchild,level-1);
}int treedepth(treenode *root)
void releasetree(treenode* root)
}bool deletebst(treenode *root, element key)
else if(key < root->data)
return deletebst(root->leftchild, key);
else
return deletebst(root->rightchild, key);
}}bool delete(treenode* p)
else if(p->leftchild == null)
else
p->data = s->data; //s指向被刪結點的「前驅」
/*s->rightchild為空,s->leftchild可能為空也可能不為空,
p=q說明s是p(即q)的左子節點,q->leftchild = s->leftchild;
p!=q說明s是q的右子節點,q->rightchild = s->leftchild;
*/if(q!=p)
q->rightchild = s->leftchild; //重接*q的右子樹,q為s的父節點
else
q->leftchild = s->leftchild; //重接*q的左子樹,q為s的父節點
delete s;
}return true;
}
二叉樹基本操作
一.二叉樹的定義 二.二叉樹的建立 定義一棵無資料的二叉樹 6 int left size 7 int right size 為了操作簡便,我們定義一棵不需要儲存資料的二叉樹,只要能儲存節點之間的邏輯關係就行,所以用兩個陣列來表示。left i 第i個節點的左子節點的序號 right i 第i個節點...
二叉樹基本操作
include include define maxsize 100 typedef char elemtype typedef struct node btnode void createbtnode btnode b,char str 由str串建立二叉鏈 j ch str j btnode f...
二叉樹基本操作
include include include using namespace std template struct binode template class bitree bitree datatype a,intn bitree void preorder void inorder void...