作业1

问题1

请设计一个算法,要求该算法把二叉树的叶子结点按从左到右的顺序连成一个单链表,表头指针为head。
二叉树按二叉链表方式存储,链接时用叶子结点的右指针域来存放单链表指针。

  • 二叉树头文件BinaryTree.h
#ifndef BT
#define BT

#include <iostream>
using namespace std;

//模板节点类
template <class Type>
class BinTreeNode
{
public:
    BinTreeNode<Type> *leftChild=NULL, *rightChild=NULL;
    Type data;
};


//模板二叉树类
template <class Type>
class BinaryTree
{
public:
    BinTreeNode<Type> *root ;

    BinaryTree(){ root = NULL;};
    BinaryTree(BinTreeNode<Type> *r){root = r;}
    BinaryTree(const Type& key){ BinTreeNode<Type> r(key); root = &r;}

    void PreOrder(BinTreeNode<Type> *current);
    void InOrder(BinTreeNode<Type> *current);
    void PostOrder(BinTreeNode<Type> *current);

    BinTreeNode<Type>*  create();
    void destroy(BinTreeNode<Type>* r);
};

//删除包含输入节点及以其为根节点的子树,后序删除
template <typename T>
void BinaryTree<T>::destroy(BinTreeNode<T>* r)
{
    if(r != NULL)
    {
        destroy(r->leftChild);
        destroy (r->rightChild);
        cout << "删除值为" << r->data << "的节点" << endl;
        delete r;
    }
}


template <typename T>
BinTreeNode<T>* BinaryTree<T>::create(){

    BinTreeNode<T>* current;

    T val;
    //cout << "按照中序,输入字符串。‘-’表示NULL:" << endl;
    cin >> val;//输入键值
    cout << "读入" << val << endl;
    if(val == '-')//标识当前子树为空,转向下一节点
    {
        cout << "空节点" << endl;
        return NULL;
    }
    else{
        current = new BinTreeNode<T>;
        current->data = val;
        cout << "创建一个非空节点,值是" << val << endl;
        current->leftChild = create();
        current->rightChild = create();
    }
    return current;
}


template <class Type>
void BinaryTree<Type>::PreOrder(BinTreeNode<Type> *current)
{
    if(current != NULL)
    {
        cout << current->data;
        PreOrder (current->leftChild);
        PreOrder (current->rightChild);
    }
}

template <class Type>
void BinaryTree<Type>::InOrder(BinTreeNode<Type> *current)
{
    if(current != NULL)
    {
        InOrder(current->leftChild);
        cout << (current->data);
        InOrder (current->rightChild);
    }
}

template <class Type>
void BinaryTree<Type>::PostOrder(BinTreeNode<Type> *current)
{
    if(current != NULL)
    {
        PostOrder(current->leftChild);
        PostOrder (current->rightChild);
        cout << (current->data);

    }
}

#endif
  • main函数文件
#include<iostream>
#include "BinaryTree.h"
using namespace std;

template <typename T>
BinTreeNode<T> * leafLink(BinTreeNode<T> *r);
void hw1_1();

int main()
{
    hw1_1();
}

void hw1_1()
{
    BinTreeNode<char> *head;
    BinTreeNode<char> *temp;
    cout << "按照中序,输入字符串。‘-’表示NULL:" << endl;//abd--ef--g--c--
    BinaryTree<char> tree;
    tree.root = tree.create();
    cout << "............." <<endl;
    head = leafLink(tree.root);
    cout << "单链表:" << endl;

    while(head->rightChild != NULL)
    {
        temp=head;
        cout << head->data << "-->";
        head = head->rightChild;
        temp->rightChild = NULL;
    }

    cout << head->data <<endl;

    tree.destroy(tree.root);
}

template <typename T>
BinTreeNode<T> * leafLink(BinTreeNode<T> *r)
{
    static BinTreeNode<T> *s1,*s2;
    //static int flag=0;
    //BinTreeNode<T>* current;
    if(r == NULL)
        return NULL;
    if(r->leftChild ==NULL && r->rightChild == NULL)
    {
        if(s2==NULL)
        {   s2 = r;s1 = r; cout << "找到一个叶子节点,值是" << s1->data << endl;} //cout << "找到一个叶子节点,值是" << s1->data << endl;}
        else
        {   s2->rightChild = r;s2 = r;cout << "找到一个叶子节点,值是" << r->data << endl;} //cout << "找到一个叶子节点,值是" << r->data << endl;}
    }
    else
    {
        leafLink(r->leftChild);
        leafLink(r->rightChild);
    }

    return s1;
}
  • 运行测试
    1. 构建的二叉树为:


    2. 控制台输入及输出:
按照中序,输入字符串。‘-’表示NULL:
abd--ef--g--c--
读入a
创建一个非空节点,值是a
读入b
创建一个非空节点,值是b
读入d
创建一个非空节点,值是d
读入-
空节点
读入-
空节点
读入e
创建一个非空节点,值是e
读入f
创建一个非空节点,值是f
读入-
空节点
读入-
空节点
读入g
创建一个非空节点,值是g
读入-
空节点
读入-
空节点
读入c
创建一个非空节点,值是c
读入-
空节点
读入-
空节点
.............
找到一个叶子节点,值是d
找到一个叶子节点,值是f
找到一个叶子节点,值是g
找到一个叶子节点,值是c
单链表:
d-->f-->g-->c
删除值为d的节点
删除值为f的节点
删除值为g的节点
删除值为e的节点
删除值为b的节点
删除值为c的节点
删除值为a的节点

问题2

已知二叉树以二叉链表存储,编写算法完成:对于树中每一个元素值为x的结点,删去以它为根的子树,并释放相应的空间。

  • main函数文件
#include<iostream>
#include "BinaryTree.h"
using namespace std;

template <typename T>
BinTreeNode<T> * leafLink(BinTreeNode<T> *r);
void hw1_1();
void hw1_2();

int main()
{
    hw1_2();
}

template <typename T>
void findAndDel(T &key, BinTreeNode<T> *r, BinaryTree<T> &tree);
void hw1_2()
{
    cout << "按照中序,输入字符串。‘-’表示NULL:" << endl;
    BinaryTree<char> tree;
    tree.root = tree.create();
    cout << "目前树的前序输出:  ";
    tree.PreOrder(tree.root);
    cout << endl;

    char key;
    cout << "输入要删除的字符" << endl;
    cin >> key;

    findAndDel(key, tree.root, tree);

    cout << "............."<< endl;
    cout << "删除值为"<<key<<"节点后,树的前序输出:  ";
    tree.PreOrder(tree.root);
    cout << endl;
    tree.destroy(tree.root);
}


template <typename T>
void findAndDel(T &key, BinTreeNode<T> *r, BinaryTree<T> &tree)
{
    if(r != NULL)
    {
        if(key == r->data)
        {
            cout << "找值为"<< r->data <<"的节点" << endl;
            tree.destroy(r->leftChild);
            tree.destroy(r->rightChild);
            r->leftChild = NULL;
            r->rightChild = NULL;
        }
        else
        {
            //cout << "找值为"<< r->data <<"的左子树" << endl;
            findAndDel(key, r->leftChild, tree);
            //cout << "找值为"<< r->data <<"的右子树" << endl;
            findAndDel(key, r->rightChild, tree);
        }
    }
}
  • 运行测试
按照中序,输入字符串。‘-’表示NULL:
abd--ef--g--ceh--k--i--
读入a
创建一个非空节点,值是a
读入b
创建一个非空节点,值是b
读入d
创建一个非空节点,值是d
读入-
空节点
读入-
空节点
读入e
创建一个非空节点,值是e
读入f
创建一个非空节点,值是f
读入-
空节点
读入-
空节点
读入g
创建一个非空节点,值是g
读入-
空节点
读入-
空节点
读入c
创建一个非空节点,值是c
读入e
创建一个非空节点,值是e
读入h
创建一个非空节点,值是h
读入-
空节点
读入-
空节点
读入k
创建一个非空节点,值是k
读入-
空节点
读入-
空节点
读入i
创建一个非空节点,值是i
读入-
空节点
读入-
空节点
目前树的前序输出:  abdefgcehki
输入要删除的字符
e
找值为e的节点
删除值为f的节点
删除值为g的节点
找值为e的节点
删除值为h的节点
删除值为k的节点
.............
删除值为e节点后,树的前序输出:  abdecei
删除值为d的节点
删除值为e的节点
删除值为b的节点
删除值为e的节点
删除值为i的节点
删除值为c的节点
删除值为a的节点
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容

  • B树的定义 一棵m阶的B树满足下列条件: 树中每个结点至多有m个孩子。 除根结点和叶子结点外,其它每个结点至少有m...
    文档随手记阅读 13,202评论 0 25
  • 第一章 绪论 什么是数据结构? 数据结构的定义:数据结构是相互之间存在一种或多种特定关系的数据元素的集合。 第二章...
    SeanCheney阅读 5,760评论 0 19
  • 原文链接 B树 1.前言: 动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(...
    非典型程序员阅读 1,153评论 0 3
  • 今天今天今天!!!来伙伴了🤘 我也不知道我为啥是半截眉毛再见🤔 自己能连做俯卧撑12个了有点不可思议!!! 还能连...
    Maggie_567阅读 304评论 0 0
  • 望⽉歸山照。長郭夜不及。通螗蜩牖亂。扇⼦杜鵑輕。共和⼄未三 ⽉初八於山中
    馮亹初阅读 123评论 0 0