一、树的基本概念
二、二叉树的及其存储表示
1.二叉树的顺序储存
//SqBTree.h
#pragma once
#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;
const int maxSize = 128;
typedef char TElemType;
typedef struct {
TElemType data[maxSize];
int n;
}SqBTree;
2.二叉树的链式储存
//BinTree.h
#pragma once
#include<cstdio>
#include<cstdlib>
typedef char TElemType;
typedef struct node {
TElemType data;
struct node* lchild, * rchild;
}BiTNode, *BinTree;
//BinTree.cpp
#include "BinTree.h"
#define queSize 64
void createSqBTree(BinTree& BT, char a[][3], int n) {
int k = 0;
BiTNode* s, * p;
BT = (BiTNode*)malloc(sizeof(BiTNode));
BT->data = a[0][0];
BT->lchild = BT->rchild = NULL;
BinTree Q[queSize]; Q[0] = BT;
for (int i = 0; i < n; i++) {
for (int j = 0; j <= k; j++) {
if (a[i][0] == Q[j]->data) {
p = (BiTNode*)malloc(sizeof(BiTNode));
p->data = a[i][1];
p->lchild = p->rchild = NULL;
s = Q[j]; Q[++k] = p;
if (a[i][2] == '0') s->lchild = p;
else s->rchild = p;
break;
}
}
}
}
三、二叉树的遍历
1.二叉树遍历递归算法
//BinTree.cpp
#include "BinTree.h"
void PreOrder_recur(BiTNode* T) {
if (T != NULL) {
printf("%c ", T->data);
PreOrder_recur(T->lchild);
PreOrder_recur(T->rchild);
}
}
void inOrder_recur(BiTNode* T) {
if (T != NULL) {
inOrder_recur(T->lchild);
printf("%c ", T->data);
inOrder_recur(T->rchild);
}
}
void PostOrder_recur(BiTNode* T) {
if (T != NULL) {
PostOrder_recur(T->lchild);
PostOrder_recur(T->rchild);
printf("%c ", T->data);
}
}
void createBinTree_Pre(BiTNode*& T, TElemType pre[], int& n) {
TElemType ch = pre[n++];
if (ch == ';') return;
if (ch != '#') {
T = (BiTNode*)malloc(sizeof(BiTNode));
T->data = ch;
createBinTree_Pre(T->lchild, pre, n);
createBinTree_Pre(T->rchild, pre, n);
}
else T = NULL;
}
void clearBinTree(BiTNode*& T) {
if (T != NULL) {
clearBinTree(T->lchild);
clearBinTree(T->rchild);
free(T);
T = NULL;
}
}
int Height(BiTNode* T) {
if (T == NULL) return 0;
else {
int i = Height(T->lchild);
int j = Height(T->rchild);
return(i < j) ? j + 1 : i + 1;
}
}
BiTNode* getParent(BiTNode* T, BiTNode* p) {
if (T == NULL) return NULL;
if (T == p) return NULL;
if (T->lchild == p || T->rchild == p) return T;
BiTNode* s = getParent(T->lchild, p);
if (s != NULL) return s;
else return getParent(T->rchild, p);
}
void Exchange(BiTNode* T) {
if (T != NULL && (T->lchild != NULL || T->rchild != NULL)) {
BiTNode* p = T->lchild; T->lchild = T->rchild; T->rchild = p;
Exchange(T->lchild);
Exchange(T->rchild);
}
}
2.递归遍历算法应用举例
3.二叉树遍历的非递归算法