递归法:
先序法: 根 左 右
//void preOrder(lptree root){
// if(root!=NULL){
// printCurNodeData(root); // 根
// preOrder(root->LChild); // 左
// preOrder(root->RChild); // 右
// }
//}
中序法: 左 根 右
//void midOrder(lptree root){
// if(root!=NULL){
// midOrder(root->LChild); // 左
// printCurNodeData(root); // 根
// midOrder(root->RChild); // 右
// }
//}
后序法: 左 右 根
//void lastOrder(lptree root){
// if(root!=NULL){
// lastOrder(root->LChild); // 左
// lastOrder(root->RChild); // 右
// printCurNodeData(root); // 根
// }
//}
// 非递归法
// 将走过的路径 入栈
// 到叶子结点的时候开始 出栈
// 然后找右子树是否为NULL
void preOderBystack(lptree root) {
if (root == NULL) return;
//准备栈
lptree stack[10]; // 存储每次打印节点的位置(指针)
int stacktop = -1 ; // 栈顶标记
lptree pmove = root; // 从根节点开始打印
while (stacktop != -1 || pmove) {
// 根 左 右
while (pmove) {
pmove = root->LChild;
//路径入栈 + 打印走过的节点
stack[++stacktop] = pmove;
printf("%c\t", pmove->data);
}// 找到最左边的节点后 无路可走
if (stacktop != -1) { //栈不为空
pmove = stack[stacktop]; // 获取栈顶元素
stacktop--; // 出栈
pmove->RChild; // 右边节点
}
}
}
void midOderByStack(lptree root) {
if (root == NULL) return ;
// 准备栈
lptree stack[10];
int stacktop = -1;
// 定义移动指针
lptree pmove = root;
while (stacktop != -1 || pmove) {
// 走到最左边,将走过的结点入栈
while (pmove) {
stack[++stacktop] = pmove;
pmove = root->LChild;
}
if (stacktop != -1) {
pmove = stack[stacktop];
stacktop--;
printf(("%c\t"),pmove->data);
pmove = root->RChild;
}
}
}
void lastOderByStack(lptree root){
if(root == NULL) return;
lptree stack[10];
int stacktop = -1;
lptree pmove = root;
while(stacktop!=-1 || pmove){
while(pmove){
stack[++stacktop] = pmove;
pmove = root ->LChild;
}
if(stacktop!=-1){
pmove = stack[stacktop--];
printf("%c\t",pmove->data);
pmove = root->RChild;
}
}
}
void lastOrderByStack(lptree root){
if(root == NULL) return ;
lptree stack[10];
int stacktop=-1;
lptree pmove = root; // 移动指针
lptree plastvisit = NULL; //访问标记
// 左 右 根
while(pmove){
stack[++stacktop] = pmove;
pmove = pmove->LChild;
}
while(stacktop!=-1){
pmove = stack[stacktop--];
// 当前节点左右是否被访问
if(pmove->RChild==NULL || pmove->RChild==plastvisit){
printf("%c\t",pmove->data);
plastvisit = pmove; // 改变标记位置
}
else{
// 右边没有被访问
stack[++stacktop] = pmove;
pmove = pmove->RChild;
while(pmove){
stack[++stacktop] = pmove;
pmove = pmove -> LChild;
}
}
}
}
二叉树的三种非递归遍历
最新推荐文章于 2024-07-13 23:05:26 发布