二叉樹定義:
typedef struct BiTreeNode {
char data;
struct BiTreeNode *left, *right;
} BiTreeNode, *BiTree;
複製程式碼
二叉樹的建立:
int CreatBiTree(Bitree &T) {
char data;
// 按先序次序輸入二叉樹中節點的值(一個字元),"#"表示空樹
scanf("%c",data);
if (data == '#') {
T = NULL;
} else {
T = (BiTree)malloc(sizeof(BiTreeNode);
// 生成根節點
T -> data = data;
// 構造左子樹
CreateBiTree(T -> left);
// 構造右子樹
CreateBiTree(T -> right);
}
return 0;
}
複製程式碼
##【遞迴】
// 列印
void printTree(BiTree T) {
if (T -> data != '#') {
printf("%c",T -> data);
}
}
// 先序遍歷
void PreOrder(BiTree T) {
if (T != NULL) {
printTree(T);
PreOrder(T -> left);
PreOrder(T -> right);
}
}
// 中序遍歷
void InOrder(BiTree T) {
if (T != NULL) {
InOrder(T -> left);
printTree(T);
InOrder(T -> right);
}
}
// 後序遍歷
void PostOrder(BiTree T) {
if (T != NULL) {
PostOrder(T -> left);
PostOrder(T -> right);
printTree(T);
}
}
複製程式碼
【非遞迴】
// 先序遍歷
void PreOrder2(BiTree T) {
stack<BiTree> stack;
BiTree p = T; // p是遍歷指標
while (p || !stack.empty()) {
if (p != NULL) {
stack.push(p); // 入棧
printf("%c",p -> data);
p = p -> left;
} else {
p = stack.top();
stack.pop();
p = p -> right;
}
}
}
// 中序遍歷
void InOrder2(BiTree T) {
stack<BiTree> stack;
BiTree p = T; // p是遍歷指標
while (p || !stack.empty()) {
if (p != NULL) {
stack.push(p); // 入棧
p = p -> left;
} else {
p = stack.top();
printf("%c",p -> data);
stack.pop();
p = p -> right;
}
}
}
// 後序遍歷
typedef struct BiTreeNodePost {
char tag;
BiTree biTree;
}BiTreeNodePost, *BiTreePost;
void PostOrder2(BiTree T) {
stack<BiTree> stack;
BiTree p = T; // p是遍歷指標
BiTreePost BT;
while (p || !stack.empty()) {
// 遍歷左子樹
while (p != NULL) {
BT = (BiTreePost)malloc(sizeof(BiTreeNodePost));
BT -> biTree = p;
// 訪問過左子樹
BT -> tag = 'L';
stack.push(BT);
p = p -> child;
}
// 左右子樹訪問完畢訪問根節點
while (!stack.empty() && (stack.top()) - > tag == 'R') {
BT = stack.top();
stack.pop();
BT -> biTree;
printf("%c",BT -> biTree -> data);
}
// 遍歷右子樹
if (!stack.empty()) {
BT = stack.top();
// 訪問過右子樹
BT -> tag = 'R';
p = BT -> biTree;
p = p -> right;
}
}
}
// 層次遍歷
void LevelOrder(BiTree T) {
BiTree p = T;
queue<BiTree> queue;
queue.push(p);
while(!queue.empty()) {
// 對頭元素出隊
p = queue.front();
// 訪問p指向的節點
printf("%c",p -> data);
queue.pop();
if (p -> left != NULL) {
queue.push(p -> left);
}
if (p -> right != NULL) {
queue.push(p -> right);
}
}
}
複製程式碼