思路:
二叉树的建立采用的是递归的思想:给定一个指向根节点的指针,然后递归调用ceate()函数,自动生成一个二叉树。就像是在地上挖了个坑(根节点),然后他会拿着铲子(create函数)按照一定的规则自动挖一个很大的洞穴(二叉树)出来。当然挖坑前需要先定义每个洞长什么样(定义节点结构)。
递归就是有去(递去)有回(归来)。规模大转化为规模小是核心思想。
struct Tree{
Tree* Left;
Tree* Right;
int data;
} ;
Tree* T;
遍历二叉树
心得:
0、已知前序和中序排列或已知后序和中序排列,可以唯一确定二叉树,但已知前序和后序无法确定唯一的二叉树。
1、先找第一层根节点,左右两大块。
2、前序和后序:分出左根右三大块后,每块最靠近根的两节点为根节点下面一层的两个节点。
例:前序:A(BCD)(EF) 后序:(CDB)(FE)A
3、中序:第一个输出为最左边最下一层,中序先沿着左半边逐渐向右扩散
4、前序是根左右,所以越靠近主根节点的排列时会在上一层
所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次。
二叉树的遍历采用的也是递归的思想:如果节点有数据,则按照遍历规则打印根节点和孩子节点,没有数据则返回直到所有数据都遍历完,递归结束。
由于二叉树是非线性结构,因此,树的遍历实质上是将二叉树的各个结点转换成为一个线性序列来表示。
递归实现
常见的遍历次序:(1)先序遍历;(2)中序遍历;(3)后序遍历。
(1)前序遍历(根--左--右)
void preOrderTraverse(Node* root)
{
if( root!=NULL )
{
cout<<root->data<<' ';//或者是visit(root)
preOrderTraverse(root->Left);
preOrderTraverse(root->Right);
}
else
return;
}
(2)中序遍历(左--根--右)
void inOrderTraverse(Node* root)
{
if( root!=NULL )
{
inOrderTraverse(root->Left);
cout<<root->data<<' ';
inOrderTraverse(root-&