目录
二叉树的建立(先序遍历)
输入的序列为DAE##F##BCH###G#I##
void CreateTree(BiTree &T) //先序遍历建立二叉树
{
char x; cin>>x;
if(x=='#')
{
T=NULL;
}
else
{
T=new BiNode;
T->data=x;
CreateTree(T->lchild);
CreateTree(T->rchild);
}
}
递归先序遍历
void PreOrder(BiTree &T)
{
if(T)
{
cout<<T->data<<" ";
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
非递归先序遍历
stack<BiTree> st;
void preOrder(BiTree T)
{
BiNode *p=T;
while(p!=NULL||!st.empty())
{
if(p!=NULL)
{
cout<<p->data<<" "; // visit(p);
st.push(p);
p=p->lchild;
}
else
{
BiNode *q=st.top();
st.pop();
p=q->rchild;
}
}
}
递归中序遍历
void InOrder(BiTree &T)
{
if(T)
{
InOrder(T->lchild);
cout<<T->data<<" ";
InOrder(T->rchild);
}
}
非递归中序遍历
void inOrder(BiTree T)
{
stack<BiNode*> st;
BiNode *p=T;
while(p!=NULL||!st.empty())
{
if(p!=NULL)
{
st.push(p);
p=p->lchild;
}
else
{
BiNode *q=st.top();
cout<<q->data<<" "; // visit();
st.pop();
p=q->rchild;
}
}
}
递归后序遍历
void PostOrder(BiTree T)
{
if(T)
{
PostOrder(T->lchild);
PostOrder(T->rchild);
cout<<T->data<<" ";
}
}
非递归后序遍历
void postOrder(BiTree T)
{
stack<BiNode*> st;
BiNode *p=T;
BiNode *r=NULL; //最近访问过的节点
while(p!=NULL||!st.empty())
{
if(p!=NULL)
{
st.push(p);
p=p->lchild;
}
else
{
p=st.top();
if(p->rchild&&p->rchild!=r) //如果有右节点,访问右节点
{
p=p->rchild;
}
else //否则,访问根节点
{
st.pop();
cout<<p->data<<" ";
r=p; //刚刚访问的节点是p
p=NULL; //重置p节点
}
}
}
}
递归求树高
int Getheight(BiTree T)
{
if(T==NULL)
{
return 0;
}
int lh=Getheight(T->lchild);
int rh=Getheight(T->rchild);
return lh>rh?lh+1:rh+1;
}
递归求叶子结点数
int count_leaf(BiTree T)
{
if(T==NULL) return 0;
else if(T->lchild==NULL&&T->rchild==NULL) return 1;
else return count_leaf(T->lchild)+count_leaf(T->rchild);
}
递归求分支结点数
int count_notleaf(BiTree T)
{
if(T==NULL) return 0;
else if(T->lchild!=NULL||T->rchild!=NULL) return count_notleaf(T->lchild)+count_notleaf(T->rchild)+1;
else return count_notleaf(T->lchild)+count_notleaf(T->rchild);
}
层序遍历(用队列来进行层次遍历)
void LevelOrder(BiTree T)
{
queue<BiTree> q;
q.push(T);
while(!q.empty())
{
BiTree p=q.front();
cout<<p->data<<" "; //取出队头元素
q.pop();
if(p->lchild!=NULL) q.push(p->lchild);
if(p->rchild!=NULL) q.push(p->rchild); //是p的左右孩子,不是T的左右孩子
}
}