二叉树的先序遍历

二叉树先序遍历(按照根-左-右次序访问节点)

以下图为例:

先序遍历序列应为:1 2 4 8 9 5 10 3 6 7

分别用递归算法和非递归算法得到上述例子的先序遍历序列(这里采用先序+为叶子节点添加‘-1’作为孩子节点来唯一确定一棵二叉树,非递归代码中,注意遍历过的结点加入栈中,这样当遍历完左子树的时候可以从栈中取出他的根结点,从而遍历右子树。

#include<bits/stdc++.h>
using namespace std;

typedef struct BiTNode{
    int val;//根节点的值 
    struct BiTNode *lchild,*rchild;//左孩子指针 右孩子指针 
}BiTNode,*BiTree;
//二叉树构造函数 
BiTree createTree(){
    int val;
    cin>>val;
    if(val==-1) return NULL;
    BiTNode *T=(BiTNode *)malloc(sizeof(BiTNode));
    T->val =val;
    T->lchild =createTree();
    T->rchild =createTree();
}
//递归法遍历 
void preorder(BiTree T){
    if(T){//这里不加非空判断,不然遇到叶子结点后就不能递归下去了 
    cout<<T->val<<" ";//遍历根结点 
    preorder(T->lchild);//遍历左子树 
    preorder(T->rchild);//遍历右子树 
    }
}
//非递归法遍历
void preorder1(BiTree T){
    if(!T) return;
    stack<BiTNode *> st;//初始化栈 
    BiTNode *p=T;//用一个p指针来遍历 
    while(p||!st.empty()){//循环条件:当前结点不为空或者栈不为空(重要!!!) 
    if(p){//若当前结点不为空 
        cout<<p->val <<" ";//遍历当前结点 
        st.push(p);//遍历过的节点进栈 
        p=p->lchild ;//访问左子树结点 
      }
    else{//当前结点为空 
        p=st.top();//取出栈顶元素 
        st.pop();//弹出栈顶元素 
        p=p->rchild ;//访问右子树节点 
    }
    }
} 

int main(){
    BiTree T=createTree();
    cout<<"递归遍历结果:"<<endl;
    preorder(T);
    cout<<endl;
    cout<<"非递归遍历结果:"<<endl;
    preorder1(T); 
    return 0;
}

//二叉树先序序列:1 2 4 8 -1 -1 9 -1 -1 5 10 -1 -1 -1 3 6 -1 -1 7 -1 -1
//递归遍历:1 2 4 8 9 5 10 3 6 7
//非递归遍历:1 2 4 8 9 5 10 3 6 7 
posted @ 2024-08-23 20:22  棒打鲜橙不加冰  阅读(9)  评论(0编辑  收藏  举报