先序遍历、中序遍历、后序遍历
#include <iostream>
#include <queue>
using namespace std;
//层次建树
//元素 -> 创一个结点
//队列的结点含义:新加入结点的位置 每创一个结点左右孩子入队
//步骤:遍历字符串
//root 队列结点设计
//结点 左右孩子入队
//root为空 改变root指向
//root非空 访问队列 改变左右孩子指向 出队//结点
struct TreeNode{//数据域char data;//指针域 左子树 右子树TreeNode * leftchild;TreeNode * rigtchild;
};
//队列设计 队列结点含义:结点地址 左还是右
struct QueueNode{TreeNode *parent;//新节点的父亲地址bool isleft;//左边是否插入过
};
//插入元素层次建树 修改root的指向
void inserTreeNode(TreeNode * &root, queue<QueueNode *> &myqueue,char data){if(data !='#'){//创建结点 申请在堆空间TreeNode * pTreeNode=new TreeNode;//pTreeNodepTreeNode->data=data;//入队 队列里的结点 将刚创好的结点信息放入队列里的结点QueueNode * pQueueNode=new QueueNode;//pQueueNodepQueueNode->parent=pTreeNode;pQueueNode->isleft= false;myqueue.push(pQueueNode);//插入if(root==NULL){//插入的是第一个结点root=pTreeNode;} else{//插入不是根//pParent 用来定位父亲结点的位置QueueNode *pParent =myqueue.front();if(pParent->isleft == false){pParent->parent->leftchild=pTreeNode;//队列结点里元素结点左孩子地址pParent->isleft= true;} else{pParent->parent->rigtchild=pTreeNode;myqueue.pop();//出队delete pParent;//队首无用}}} else{//是# 插入空if(root !=NULL){QueueNode *pParent =myqueue.front();if(pParent->isleft == false){pParent->parent->leftchild=NULL;pParent->isleft= true;} else{pParent->parent->rigtchild=NULL;myqueue.pop();delete pParent;}}}
}//递归遍历
//大问题分成若干个子问题
//大树->分成几个子树 先序遍历、中序遍历、后序遍历
//小问题解决 没有子树为空
void PreOder(TreeNode *root){//先序if(root==NULL){return;}printf("%c",root->data);//根PreOder(root->leftchild);//左子树PreOder(root->rigtchild);//右子树
}
void InOrder(TreeNode *root){//中序if(root==NULL){return;}InOrder(root->leftchild);//左子树printf("%c",root->data);//根InOrder(root->rigtchild);//右子树
}
void PostOrder(TreeNode *root){if(root==NULL){return;}PostOrder(root->leftchild);//左子树PostOrder(root->rigtchild);//右子树printf("%c",root->data);//根
}
int main() {TreeNode *root=NULL;//指向根结点//新加入的结点应该放在哪个位置?放完第一个结点左右孩子 再放第二个 由结点放入的顺序决定——队列char charList[]="abc##de#g##f###";queue<QueueNode *> myqueue;for(int i=0;charList[i]!='\0';++i){inserTreeNode(root,myqueue,charList[i]);}PreOder(root);printf("\n");InOrder(root);printf("\n");PostOrder(root);printf("\n");return 0;
}