二叉树小结
文章目录
基础准备:结点信息与先序建二叉树
typedef struct TreeNode
{
char ch;
struct TreeNode* lchild, * rchild;
}TreeNode, * BiTree;
char c;
void CreatBiTree(BiTree &T)
{
cin >> c;
if (c == '#') T = NULL;//根据要求,如果是遇到0表示空结点,就将#改为0
else
{
T = new TreeNode;
T->ch = c;
CreatBiTree(T->lchild);
CreatBiTree(T->rchild);
}
return;
}
一、二叉树的遍历
1. 先序遍历
1.1 递归
void PreTraverse(BiTree &T)
{
if (T == NULL) return;
else
{
cout << T->ch << endl;
PreTraverse(T->lchild);
PreTraverse(T->rchild);
}
return;
}
1.2 非递归
void _PreTraverse(BiTree T)
{
stack<BiTree> S;
TreeNode* p = T;
TreeNode* q = NULL;//new TreeNode;
while (p || !S.empty())
{
if (p)
{
cout << p->ch << endl;
S.push(p);
p = p->lchild;
}
else
{
q = S.top(); S.pop();
p = q->rchild;
}
}
return;
}
2. 中序遍历
2.1 递归
void InTraverse(BiTree& T)
{
if (T == NULL) return;
else
{
InTraverse(T->lchild);
cout << T->ch << endl;
InTraverse(T->rchild);
}
return;
}
2.2 非递归
void _InTraverse(BiTree T)
{
stack<BiTree> S;
TreeNode* p = T;
TreeNode* q = NULL;//new TreeNode;
while (p || !S.empty())
{
if (p)
{
S.push(p);
p = p->lchild;
}
else
{
q = S.top(); S.pop();
cout << q->ch << endl;
p = q->rchild;
}
}
return;
}
3. 后序遍历
3.1 递归
void PosTraverse(BiTree& T)
{
if (T == NULL) return;
else
{
PosTraverse(T->lchild);
PosTraverse(T->rchild);
cout << T->ch << endl;
}
return;
}
3.2 非递归
void _PosTraverse(BiTree T)
{
stack<BiTree> S;
TreeNode* p = T;
TreeNode* r = NULL;//new TreeNode;
while (p || !S.empty())
{
if (p)
{
S.push(p);
p = p->lchild;
}
else
{
p = S.top();
if (p->rchild && p->rchild != r) p = p->rchild;
else
{
S.pop();
cout << p->ch << endl;
r = p;
p = NULL;
}
}
}
return;
}
4. 层序遍历
void levelorder(BiTree &T)
{
queue <BiTree> q;
TreeNode* p = T;
q.push(p);
while (p && !q.empty())
{
p = q.front(); q.pop();
cout << p->ch << ' ';
if (p->lc != NULL) q.push(p->lc);
if (p->rc != NULL) q.push(p->rc);
}
return;
}
二、二叉树深度
int Depth(BiTree& T)
{
if (T == NULL) return 0;
else
{
int m = Depth(T->lchild);
int n = Depth(T->rchild);
return (m > n) ? (m+1) : (n+1);
}
}
三、统计二叉树结点
1. 统计所有结点数
int TreeNodeCnt(BiTree& T)
{
if (T == NULL) return 0;
else
{
return TreeNodeCnt(T->lchild) + TreeNodeCnt(T->rchild) + 1;
}
}
2. 统计度为0的结点数
int TreeNodeCnt_0(BiTree& T)
{
if (T == NULL) return 0;
if (T->lchild == NULL && T->rchild == NULL) return 1;
return TreeNodeCnt_0(T->lchild) + TreeNodeCnt_0(T->rchild);
}
3. 统计度为1的结点数
int TreeNodeCnt_1(BiTree &T)
{
if (T == NULL) return 0;
if (T->lchild == NULL && T->rchild != NULL)
{
return TreeNodeCnt_1(T->rc) + 1;
}
if (T->lchild != NULL && T->rchild == NULL)
{
return TreeNodeCnt_1(T->lc) + 1;
}
return TreeNodeCnt_1(T->lc) + TreeNodeCnt_1(T->rc);
}
四、复制二叉树
void CopyBiTree(BiTree& T, BiTree& NewT)
{
if (T == NULL) NewT = NULL;
else
{
NewT = new TreeNode;
NewT->ch = T->ch;
CopyBiTree(T->lchild, NewT->lchild);
CopyBiTree(T->rchild, NewT->rchild);
}
return;
}
五、删除二叉树
void DestoryBiTree(BiTree& T)
{
if (T == NULL) return;
if (T->lchild == NULL && T->rchild == NULL)
{
delete T;
return;
}
DestoryBiTree(T->lchild);
DestoryBiTree(T->rchild);
}
错误示范
void DestoryBiTree(BiTree& T)
{
if (T == NULL) return;
TreeNode* tmp = T;
delete T;//这里T与tmp是同一块地址
DestoryBiTree(tmp->lchild);
DestoryBiTree(->rchild);
}
THEEND…