【数据结构】二叉树!!!

  • 概念:

    一颗二叉树是结点的一个有限集合,该集合为空或者是由一个根节点和一个左子树和一个右子树构成的组合。

  • 特点:

    每个结点最多有两个子树,每个子树的顺序不能变,份左子树和右子树。

  • 分类:

    满二叉树:在一棵树里面每个分支结点都存在左子树和右子树,并且所有的叶子节点都在同一层。
    完全二叉树:一棵具有N个结点的二叉树的结构和满二叉树的前N个结点相

这里写图片描述
二叉树的性质

若二叉树根结点的层数为1,那么这个非空二叉树的第i层最多有2^(i-1)个结点。
若根节点二叉树的深度为1,那么深度为K的二叉树的最大结点数是2^K-1;
对于任何一棵二叉树,如果叶节点个数为N0,度为2的非叶节点的个数为N1,那么N0 = N1+1;

二叉树的基本操作:
二叉树的遍历
这里写图片描述
前序:

  • 先访问根节点—–>左子树 —–>右子树
    结果:A B D E C F

中序:

  • 左子树—–>访问根结点—– >右子树

结果:D B E A F C

后序:

  • 左子树—–>根节点—–>访问右子树

结果:D E B F C A

层序:

  • 每一层顺序遍历二叉树

结果:A B C D E F

【二叉树的基本操作代码】

#include<stack>
#include<iostream>
using namespace std;

template<class T>
struct TreeNode
{
    TreeNode()
        :leftTree(NULL)
        ,rightTree(NULL)
    {}
    TreeNode(T& d)
        :leftTree(NULL)
         ,rightTree(NULL)
         ,data(d)
    {}
    TreeNode(const TreeNode& t)
        :leftTree(t.leftTree)
         ,rightTree(t.rightTree)
         ,data(t.data)
    {}
    TreeNode<T>* leftTree;
    TreeNode<T>* rightTree;
    T data;
};
template<class T>
class BinaryTree
{
    typedef TreeNode<T> Node;
    public:
        BinaryTree(T* arr,size_t N,T& invalid)  //construct function
            :_root(NULL)
        {
         if(arr)
         {
             size_t index = 0;
            _root = GreatTreeNode(_root,arr,N,index,invalid);       
         }
        }
        BinaryTree(BinaryTree<T>& t)        //copy construction
        {
            _root = _CopyTree(t._root);   
        }
        Node* _CopyTree(Node *root2)        //copy tree
        {
            if(NULL == root2)
                return NULL;
            Node* root1 = new Node(root2->data);
            root1->leftTree = _CopyTree(root2->leftTree);
           root1->rightTree = _CopyTree(root2->rightTree);
            return root1;
        }
        void PrePrint()                     //print by front
        {
            _PrePrint(_root);   
        }
        void _PrePrint(Node* root)
        {
            if(NULL == root)
                return ;
            cout<<root->data<<" ";
            _PrePrint(root->leftTree);
            _PrePrint(root->right
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值