最近在学习数据结构与c++语言,学到了树的这一章。学习了二叉树的创建与遍历,特此做一个小的总结。水平有限请多包涵。
c++自己实现了列栈和队列与线性表结构,分别是stack、deque、list。
数据的逻辑结构
1.线性结构
1.1线性表
1.2栈(特殊线性表,先进后出)
1.3队列(特殊线性表,先进先出)
1.4字符串、数组、广义表
2.非线机构
2.1树形结构(一对多)
2.2图形结构(多对多)
#include <bits/stdc++.h>
using namespace std;
typedef char Elemtype;
typedef struct BitNode{ //树节点
Elemtype data;
BitNode *lchild,*rchild;
}BitNode,*BitTree;
/**
二维指针
前序插入初始化
*/
void createBiTree(BitTree *tree){
char c;
scanf("%c",&c);
if(c=='#'){
*tree=NULL;
}else{
*tree=new BitNode; //分配指针存储空间
(*tree)->data=c;
createBiTree(&(*tree)->lchild);
createBiTree(&(*tree)->rchild);
}
}
/**
递归遍历(中序)
*/
void printBiTree(BitTree &p){
if(p){
printBiTree(p->lchild);
printf("%c",p->data);
printBiTree(p->rchild);
}
}
/**
非递归遍历,中序
(1)建立一个栈
(2)根节点进栈,遍历左子树
(3)根节点出栈,输出根结点,遍历右子树
*/
void printBiTree2(BitTree &p){
stack<BitTree> stk;
BitTree node=new BitNode; //分配内存
while(p||!stk.empty()){
if(p!=NULL){ //入栈
node=p;
stk.push(node);
p=p->lchild;
}else{ //出栈
node=stk.top();
printf("%c",node->data);
stk.pop();
p=node->rchild;
}
}
}
int main(){
BitNode *p=NULL;
createBiTree(&p);
printBiTree(p); //递归
cout<<endl;
printBiTree2(p); //非递归(栈)
return 0;
}