二叉树先序遍历(按照根-左-右次序访问节点)
以下图为例:
先序遍历序列应为: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标签:结点,遍历,val,BiTNode,二叉树,先序 From: https://www.cnblogs.com/doris510/p/18377028