二叉树:
有且只有一个称为根的结点,每个结点最多有两棵子树,且二叉树的子树有左右之分,次序不能任意颠倒。
建立二叉树:先序建立二叉树,输入字符,若字符为#,则树为空树;否则申请一个结点,将字符赋给结点的信息;递归创建左子树,递归创建右子树。
遍历输出二叉树:后序遍历二叉树,递归后序遍历左子树;递归后序遍历右子树,输出根节点的值。
二叉树的深度:递归访问左右子树,两个数来分别记录访问左右子树时,进行加一操作,最后较大的那一个值为二叉树的深度。
插入结点:这里插入直接为所找双亲的左子树,先找到双亲,将双亲的左孩子指向新建立的结点(也是带插入的结点),取代原来左孩子的位置。
#include<iostream>
#include <stdio.h>
using namespace std;
typedef struct BiTNode
{
char data;
BiTNode*lchild = NULL, *rchild = NULL;
}BiTNode, *BiTree;
void CreateBiTree(BiTree&T) //先序建立二叉树
{
char ch;
cin >> ch;
if (ch == '#') T = NULL;
else
{
T = new BiTNode;
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
void PostOrderTraverse(BiTree T) //后序遍历输出二叉树
{
if (T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout << T->data;
}
}
int Depth(BiTree T) //计算树的深度。
{
int RDe = 0, LDe =
0;
if (T == NULL)return 0;
else
{
LDe = Depth(T->lchild);
RDe = Depth(T->rchild);
if (LDe > RDe)
{
return LDe + 1;
}
else return RDe + 1;
}
}
BiTNode*Q = NULL;
BiTNode*
SeeK(BiTree T, char ch) //递归查找
{
if (T)
{
if (T->data == ch)
{
Q = T;
}
else
{
SeeK(T->lchild, ch);
SeeK(T->rchild, ch);
}
}
return Q;
}
void Insert(BiTree T) //直接插为双亲的左孩子
{
char ch, chParent;
BiTNode*p = new BiTNode;
BiTNode *S;
cout << "输入要插入的字符:" << endl;
cin >> ch;
p->data = ch;
cout << "输入你想要插入结点的双亲的字符:" << endl;
cin >> chParent;
S = SeeK(T, chParent);
if (S == NULL)
{
cout << "没找到双亲字符!" << endl;
p = NULL;
}
else
{
if (S->lchild == NULL) { S->lchild
= p; }
else
{
p->lchild =
S->lchild->lchild;
p->rchild =
S->lchild->rchild;
S->lchild = p;
}
}
}
void main()
{
BiTree T;
int temp1 = 1;
int temp2 = 0;
cout << "开始创建二叉树,请以“AB#DF###CEG##H###”先序创建二叉树 这种格式输入结点数据:" << endl;
CreateBiTree(T);
while (temp1 == 1)
{
cout << "遍历输出二叉树请按“1”;输出二叉树的深度请按“2”;插入结点请按“3”;" << endl;
cin >> temp2;
while (temp2 != 1 &&temp2 != 2 &&temp2 != 3)
{
cout << "输入字符不符合要求,请重新输入";
cin >> temp2;
}
switch (temp2)
{
case 1:
{
cout << "后序遍历输出二叉树:" << endl;
PostOrderTraverse(T);
}break;
case 2:
{
cout << "树的深度为:" << Depth(T) << endl;
}break;
case 3:
{
cout << "插入:" << endl;
Insert(T);
}break;
}
cout
<<'\n'<< "是否要继续操作,继续请按“1”;结束请按“0”;" << endl;
cin >> temp1;
}
system("pause");
}
在遍历时出现了读取访问权限这一错误
解决方法是结构体要初始化。链表的末尾一定要保持指向NULL才能用T->Lchild==NULL如果结构体不初始化的话,就不能保证每次新建的尾节点指向NULL。
另一种方法是在NEW结点的时候就将新的结点的左孩子和右孩子置空。