第五章:树和二叉树之算法设计题

//未完,后续补充
#include 
#include <string.h>
#include 
#include 
using namespace std;
#define Status int
#define OK 1
#define ERROR 0
/*
(1)统计二叉树中叶子结点个数
(2)判别两棵树是否相等
(3)交换二叉树每个结点的左孩子和右孩子
(4)双序遍历方法
(5)计算二叉树的最大宽度:
(6)按层次顺序遍历二叉树:
    //(5)(6)是借助队列来实现的,当当前队列非空的时候,读取队列首元素,并且在队尾增加其左右孩子结点。

(7)求二叉树中第一条最长的路径,并输出路径上的值
    //这个借助栈的实现,后序遍历;
(8)输出二叉树中从每个叶子节点到根结点的路径

*/

//结点类型
typedef struct LNode
{
    char number;
    LNode *L,*R;
}LNode,*LinkList;
LinkList L1,L2;

//使用递归的方式建立二叉树 :先序遍历
void Creat(LinkList &L)
{
    char ch;
    cin>>ch;
    if(ch=='#') L=NULL;
    else
    {
        L=new LNode ;
        L->number = ch;
        Creat(L->L);
        Creat(L->R);
    }
}

//统计二叉树中的叶子结点个数:
int TongJi(LinkList L)
{
    //返回的即为叶子结点个数;
    if(!L) return ERROR;
    if(!L->L && !L->R) return 1;
    return TongJi(L->L)+TongJi(L->R);
}
int flag=1;
void PanDuan(LinkList L1,LinkList L2)
{
    //判断两棵树是否相等;
    
    if(!L1 && !L2) 
        ;
    else if(!L1 || !L2) 
        flag=0;
    else
        if(L1->number != L2->number) flag=0;
        else
        {
            PanDuan(L1->L,L2->L);
            PanDuan(L1->R,L2->R);
        }
}

//交换二叉树左右结点;
Status JiaoHuan(LinkList &L)
{
    if(L)//当当前结点不为空时;
    {
        LinkList p;
        p=L->L;L->L=L->R;L->R=p;
        JiaoHuan(L->L);JiaoHuan(L->R);
    }
    return OK;
}

//int KuanDu(LinkList L)
//{
//    return OK;
//}
//宽度优先遍历二叉树;按层次遍历;
int n=0,ans[N+10];
int dfs()
{
    int front=0,rear=1;
    LNode *q[N+10];
    q[0]=root;
    while(front<rear)
    {
        //宽度优先遍历,利用队列;
        LNode *u=q[front++];
        if(!u->value) {failed=1;return 0;}
        ans[n++]=u->number;
        if(u->L) q[rear++]=u->L;
        if(u->R) q[rear++]=u->R;
    }
    return 1;
}

 



int
main() { //创建两棵树; Creat(L1); Creat(L2); //输出叶子结点个数; printf("叶子结点个数为:%d\n",TongJi(L1)); //判断两棵树是否相等。 //flag=1;//先重置标志变量flag; //PanDuan(L1,L2); //if(flag) printf("两棵树相等!\n"); //else printf("两棵树不相等!\n"); //交换二叉树的左右孩子结点; //JiaoHuan(L1); //以下为交换了其中一棵树的左右孩子之后,看其是否仍旧相等; //flag=1;//先重置标志变量flag; //PanDuan(L1,L2); //if(flag) printf("两棵树相等!\n"); //else printf("两棵树不相等!\n"); return 0; }

 

你可能感兴趣的:(第五章:树和二叉树之算法设计题)