<二叉树>创建二叉树

二叉树
栈、队列、链表是一对一的线性关系
    栈、队列的优势是,根据索引快速找到其中的任意某个元素,劣势就是插入和删除某个元素,因为会移动后面所有相关的元素
    链表的优点是插入和删除元素很方便,缺点是找某个特定位置的元素,因为需要遍历每个节点o(n)
    
树是一对多的非线性关系
    结合了顺序存储和链式存储的优点,二叉树结合了栈、队列、链表的优点
    可以快速对数据进行插入、删除、查找,(即增删查)

    利用树的结构可以大批量的处理动态数据,大大提高数据的排序和检索效率

    数据结构与算法是训练一个人的编程思想的
二叉树的条件
         o 
        / \
       o   o 
      / \ / \ 
     o  oo   o
    1.有且仅有一个根节点,最多有两个子树
    2.子节点:Tl = 左子树 Tr = 右子树,子树本身也是一个二叉树(notice:递归思想)

表示二叉树的一个节点
    1.元素内容------链表数据域
    2.两个二叉树的结构体指针,分别指向左子树和右子树
        链表结构体指针指向下一个节点的指针域
        链表节点与二叉树节点非常相似,二叉树节点只比链表节点多了一个结构体指针
        去掉左子树指针域或右子树指针域,就变成了链表数据结构
    3.每个左右子树都可以作为一个根节点继续往下分,使用递归的方式创建二叉树


遍历二叉树:1.先序遍历、2.中序遍历、3.后序遍历
    1.先序遍历
      先访问根节点,然后遍历左子树,再遍历右子树

    数据结构训练的是编程思想,而不是背公式背套路模板


树:
         o A
        / \
     B o   o C
      / \ /
   D o EooF
          \
           O G
#include <stdio.h>
#include <iostream>
using namespace std;

// 二叉树节点
struct BinTree_node
{
    // 节点内容
    unsigned char elem;
    // 左子树
    struct BinTree_node* Ltree;
    // 右子树
    struct BinTree_node* Rtree;
};

struct BinTree_node* create_bintree();



int main(void)
{
    // 返回二叉树指针
    struct BinTree_node* mytree;
    mytree = create_bintree();


    return 0;
}


struct BinTree_node* create_bintree()
{
    unsigned char flag;
    // 根节点:结构体对象指针
    struct BinTree_node* tree;
    // 动态存储:调用默认构造函数创建对象,为对象分配空间,让tree指向该内存空间
    tree = new BinTree_node();
    // tree = (struct BinTree_node*)malloc(sizeof(struct BinTree_node));
    cout << "请输入当前节点元素:" << endl;
    cin >> tree->elem;

    cout << "是否要为当前节点建立左子树,(Y/N)? for " <<  tree->elem << endl;
    cin >> flag;

    if(flag == 'Y')
        tree->Ltree = create_bintree();// 递归的思想:递归调用创建左子树
    else
        tree->Ltree = nullptr;

    cout << "是否要为当前节点建立右子树,(Y/N)?  for " << tree->elem << endl;
    cin >> flag;

    if(flag == 'Y')
        tree->Rtree = create_bintree();// 递归的思想:递归调用创建右子树
    else
        tree->Rtree = nullptr;

    return tree;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值