二叉树代码

#include <iostream>
#include <stack>
#include<queue>
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<iomanip>
using namespace std;
#define maxSize 50
typedef struct BiTNode
{
    char data;
    struct BiTNode *lchild;
    struct BiTNode *rchild;
}BiTNode, *BiTree;


void CreatBiTree(BiTree &T)//前序输入创建二叉树
{
    char ch;
    cin >> ch;
    if(ch == '#')
        T = NULL;
    else
    {
        T = new BiTNode;
        T->data = ch;
        CreatBiTree(T->lchild);
        CreatBiTree(T->rchild);
    }
}
void PerOrderTraverse(BiTree p)//递归前序遍历
{
    if(p != NULL)
    {
        cout << p->data <<" ";
        PerOrderTraverse(p->lchild);
        PerOrderTraverse(p->rchild);
    }
}
void InOrderTraverse(BiTree T)//递归中序遍历
{
    if( T != NULL )
    {
        InOrderTraverse(T->lchild);
        cout << T->data << " ";
        InOrderTraverse(T->rchild);
    }
}
void PostOrderTraverse(BiTree T)//递归后序遍历
{
    if(T != NULL)	//跳出递归条件 
    {
        PostOrderTraverse(T->lchild);
        PostOrderTraverse(T->rchild);
        cout << T->data << " ";
    }
}



int inOrderTraverse(BiTree T)//迭代中序遍历
{
    stack<BiTree> S;
    S.push(T);
	while(!S.empty())
	{
		while(S.top())
        {
            T = T->lchild;
            S.push(T);
        }
		S.pop();
		if(!S.empty())
        {
            T = S.top();
            cout << T->data << " ";
            S.pop();
            T = T->rchild;
            S.push(T);
        }
	}
	return 1;
}

void inorderNorecursion(BiTree T)//迭代中序遍历2
{
	if(T != NULL)
	{
		BiTree Stack[maxSize];
		int top = -1;
		BiTree p;
		p = T;
		while (top != -1 || p != NULL)
		{
			while (p != NULL)
			{
				Stack[++top] = p;
				p = p->lchild;
			}
			if(top != -1)
			{
				p = Stack[top--];
				cout << p->data << " ";
				p = p->rchild;
			}
		}
	}
}


int PreorderNonrecursion(BiTree T)//非递归先序遍历算法
{
	BiTree Stack[maxSize];
	int top = -1;
	BiTree p;
	Stack[++top] = T;
	while(top != -1)
	{
		p = Stack[top--];
		cout << p->data << " ";
		if(p->rchild)
		Stack[++top] = p->rchild;
		if(p->lchild)
		Stack[++top] = p->lchild;
	}
}


void postorderNonrecursion(BiTree T)//非递归后序 
{
	if(T != NULL)
	{
		BiTree Stack1[maxSize];
		BiTree Stack2[maxSize];
		
		int top1 = -1;
		int top2 = -1;
		BiTree p = NULL;
		
		Stack1[++top1] = T;
		while(top1 != -1)
		{
			p = Stack1[top1--];
			Stack2[++top2] = p;
			if(p->lchild != NULL)
				Stack1[++top1] = p->lchild;
			if(p->rchild != NULL)
				Stack1[++top1] = p->rchild;
		}
		while (top2 != -1)
		{
			p = Stack2[top2--];
			cout << p->data << " ";
		}
	}
}


void LevelOrderTraverse(BiTree T)//层序遍历 
{
	queue<BiTree> Q;			//创建一个队列
    Q.push(T);					//先压入第一个节点
    while(!Q.empty())			// 队列不为空
    {
        T = Q.front();		 	//T指向队首元素
        cout << T->data << " "; //输出队首元素
        Q.pop();				//弹出队首元素 
       	if(T->lchild)			//T的左孩子不为空(有左子树) 
           Q.push(T->lchild);	//T的左孩子压入队列 
       	if(T->rchild)			//T的右孩子不为空(有右子树) 
           Q.push(T->rchild);	//T的右孩子压入队列 
    }
}


int GetDepth(BiTree T)//求树深度
{
    int LD = 0,RD = 0;
    if(T == NULL)
        return 0;
    else
    {
        LD = GetDepth(T->lchild);
        RD = GetDepth(T->rchild);
        if(LD >= RD)
        return LD + 1;
        else
        return RD + 1;
    }
}



void CountLeaf(BiTree root, int &number)//叶子节点 
{

    if(root != NULL)
    {
        if(!root->lchild && !root->rchild)
        {
            number++;
            cout << root->data << " ";
        }
        if(root->lchild)
            CountLeaf(root->lchild, number);
        if(root->rchild)
            CountLeaf(root->rchild, number);
    }
}


void Postorder(BiTree T)//非递归后序遍历 
{
    BiTree Seqstack[maxSize];
    int top = -1;
    int flag = 1;
    BiTree p;
    if(T != NULL)
    {
       	do
        {
            while(T != NULL)                    // 循环,将所有最左结点压栈
            {
                top ++;
                Seqstack[top] = T;
                T = T->lchild;
            }
            flag = 1;                           // 辅助变量flag为1表示当前结点的左孩子为空或者已被访问
            p = NULL;                           // 指针变量p指向当前结点的前驱结点
            while(top > -1&& flag == 1)
            {
                T = Seqstack[top];              // 注意:这里只是获取栈顶元素,而并没有出栈
                if(T->rchild == p)              // 如果当前结点右孩子为空,或者已经被访问过,则访问当前结点
                {
                    top --;                     // 当前结点出栈
                    cout << T->data << " ";
                    p = T;                      // 指针变量指向当前结点
                }
                else                            // 如果当前结点右孩子不为空,则先去处理右孩子
                {
                    T = T->rchild;              // 处理右孩子
                    flag = 0;                   // T的左孩子未被访问,flag置为0
                }
            }
        }while(top > -1);
    }
}

void postOrder3(BiTree root)     //非递归后序遍历
{
    stack<BiTree> s;
    BiTree cur;                      //当前结点 
    BiTree pre=NULL;                 //前一次访问的结点 
    s.push(root);
    while(!s.empty())
    {
        cur=s.top();
        if((cur->lchild==NULL&&cur->rchild==NULL)||
           (pre!=NULL&&(pre==cur->lchild||pre==cur->rchild)))
        {
            cout<<cur->data<<" ";  //如果当前结点没有孩子结点或者孩子节点都已被访问过 
              s.pop();
            pre=cur; 
        }
        else
        {
            if(cur->rchild!=NULL)
                s.push(cur->rchild);
            if(cur->lchild!=NULL)    
                s.push(cur->lchild);
        }
    }    
}

int main(){
    BiTree T;
    cout << "请按照前序遍历法输入二叉树,用#补齐" << endl;
    CreatBiTree(T);
    cout << endl;
    cout << "前序递归遍历结果:" ;
    PerOrderTraverse(T);
	cout << "	";
    cout << "非递归先序遍历结果:" ; 
    PreorderNonrecursion(T);
    cout << endl;
    
    cout << "中序递归遍历结果:" ;
    InOrderTraverse(T);
    cout << "	";
    cout << "非递归中序遍历结果:";
   	inorderNorecursion(T);
    cout << endl;
    
    cout << "后续递归遍历结果:" ;
    PostOrderTraverse(T);
    cout << "	";
    cout << "非递归后续遍历结果:";
	postOrder3(T);
	//Postorder(T); 
	//postorderNonrecursion(T); 
	cout << endl;
    
    
    cout << "层序遍历结果为:";
    LevelOrderTraverse(T);
    cout << endl;
    
    
    cout << "树深为:" ;
    int depth;
    depth = GetDepth(T);
    cout << depth <<endl;
    cout << "树的叶子节点为:" ;
    int number = 0; 
    CountLeaf(T, number);
    cout << endl;
    cout << "树的叶子节点的个数为:" << number << endl; 
    return 0;
}

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值