数据结构作业2

本文详细介绍了二叉树的构建过程,包括先序建立、遍历输出、计算深度和插入结点的方法。通过C++实现,展示了如何递归地创建和遍历二叉树,以及计算其深度和进行结点插入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二叉树:

有且只有一个称为根的结点,每个结点最多有两棵子树,且二叉树的子树有左右之分,次序不能任意颠倒。

建立二叉树:先序建立二叉树,输入字符,若字符为#,则树为空树;否则申请一个结点,将字符赋给结点的信息;递归创建左子树,递归创建右子树。

遍历输出二叉树:后序遍历二叉树,递归后序遍历左子树;递归后序遍历右子树,输出根节点的值。

二叉树的深度:递归访问左右子树,两个数来分别记录访问左右子树时,进行加一操作,最后较大的那一个值为二叉树的深度。

插入结点:这里插入直接为所找双亲的左子树,先找到双亲,将双亲的左孩子指向新建立的结点(也是带插入的结点),取代原来左孩子的位置。



#include<iostream>

#include <stdio.h>

using namespace std;

 

typedef struct BiTNode

{

    char data;

    BiTNode*lchild = NULL, *rchild = NULL;

}BiTNode, *BiTree;

 

void CreateBiTree(BiTree&T)          //先序建立二叉树

{

    char ch;

    cin >> ch;

    if (ch == '#') T = NULL;

    else

    {

         T = new BiTNode;

         T->data = ch;

         CreateBiTree(T->lchild);

         CreateBiTree(T->rchild);

    }

 

}

 

void PostOrderTraverse(BiTree T)      //后序遍历输出二叉树

{

    if (T)

    {

         PostOrderTraverse(T->lchild);

         PostOrderTraverse(T->rchild);

         cout << T->data;

    }

}

 

int Depth(BiTree T)                 //计算树的深度。

{

    int RDe = 0, LDe =
0;

    if (T == NULL)return 0;

    else

    {

         LDe = Depth(T->lchild);

         RDe = Depth(T->rchild);

         if (LDe > RDe)

         {

             return LDe + 1;

         }

         else return RDe + 1;

    }

}

 

 

BiTNode*Q = NULL;

BiTNode* 
SeeK(BiTree T, char ch)      //递归查找

{

    if (T)

    {

         if (T->data == ch)

         {

             Q = T;

         }

         else

         {

             SeeK(T->lchild, ch);

             SeeK(T->rchild, ch);

         }

    }

    return Q;

}

 

 

void Insert(BiTree T)         //直接插为双亲的左孩子     


{

    char ch, chParent;

    BiTNode*p = new BiTNode;

    BiTNode *S;

    cout << "输入要插入的字符:" << endl;

    cin >> ch;

    p->data = ch;

    cout << "输入你想要插入结点的双亲的字符:" << endl;

    cin >> chParent;

    S = SeeK(T, chParent);

    if (S == NULL)

    {

         cout << "没找到双亲字符!" << endl;

         p = NULL;

    }

    else

    {

         if (S->lchild == NULL) { S->lchild
= p; }

         else

         {

             p->lchild =
S->lchild->lchild;

             p->rchild =
S->lchild->rchild;

             S->lchild = p;

         }

    }

 

}

 

 

void main()

{

    BiTree T;

    int temp1 = 1;

    int temp2 = 0;

    

 

    cout << "开始创建二叉树,请以“AB#DF###CEG##H###”先序创建二叉树 这种格式输入结点数据:" << endl;

    CreateBiTree(T);

 

    while (temp1 == 1)

    {

         cout << "遍历输出二叉树请按“1”;输出二叉树的深度请按“2”;插入结点请按“3”;" << endl;

         cin >> temp2;

         while (temp2 != 1 &&temp2 != 2 &&temp2 != 3)

         {

             cout << "输入字符不符合要求,请重新输入";

             cin >> temp2;

         }

             switch (temp2)

             {

             case 1:

             {

                  cout << "后序遍历输出二叉树:" << endl;

                  PostOrderTraverse(T);

             }break;

             case 2:

             {

                  cout << "树的深度为:" << Depth(T) << endl;

             }break;

             case 3:

             {

                  cout << "插入:" << endl;

                  Insert(T);

             }break;

             }

        cout
<<'\n'<< "是否要继续操作,继续请按“1”;结束请按“0”;" << endl;

         cin >> temp1;

         }

    system("pause");

    }


在这里插入图片描述

在遍历时出现了读取访问权限这一错误

解决方法是结构体要初始化。链表的末尾一定要保持指向NULL才能用T->Lchild==NULL如果结构体不初始化的话,就不能保证每次新建的尾节点指向NULL。

另一种方法是在NEW结点的时候就将新的结点的左孩子和右孩子置空。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值