一.存储方式
1.顺序存储
用数组来存储树,数组元素的下标对应层次遍历中元素的标号。
注意:顺序存储一般只用于完全二叉树,否则空间利用率过低。
2.链式存储
typedef struct BiTNode{
TELemType data;
struct BiTNode*lchild,*rchild;
}BiTNode,*BiTree;
二.二叉树的遍历
1.先根遍历
(1)递归实现
void PreOrderTraverse(BiTree T){
if(T==NULL)
return ;
cout<<T->data;
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
(2)用栈来代替递归。
第一种算法:访问节点后将其弹栈并同时入栈左右节点。
void InOrderTraverse(BiTree T){
stack<BiTree>s;//利用栈来辅助遍历
if(T==NULL)
return ;
s.push(T);
BiTree head;
while(!s.empty()){
head=s.top();
s.pop();
cout<<head->data;
if(head->rchild!=NULL)s.push(head->rchild);
if(head->lchild!=NULL)s.push(head->lchild);//两者顺序不可以改变 ,右节点后访问需要先入栈。
}
}
第二种算法:访问节点后将其入栈,目的为了访问完左节点后回溯到父亲节点