数据结构之二叉树

数据结构之二叉树

标签(空格分隔): 学习笔记


一、 二叉树综述

树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用。
二叉树是每个结点最多有两个子树的有序树。通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用作二叉查找树和二叉堆或是二叉排序树。二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2的 i -1次方个结点;深度为k的二叉树至多有 2k1 个结点;对任何一棵二叉树T,如果其终端结点数(即叶子结点数)为n0,度为2的结点数为n2,则n0 = n2 + 1。
二叉树的链式存储结构是一类重要的数据结构,其形式定义如下:

struct TreeNode
{
    int val;
    TreeNode *left, *right;
};

二、二叉树的建立

采用递归的方法前序(根左右)建立二叉树,以#符号表示此当前数值为空。

TreeNode* CreateBiTree()
{
    char ch;
    TreeNode* T;
    scanf_s("%c", &ch);
    if (ch == '#')
    {
        T = NULL;
    }
    else
    {
        T = (TreeNode*)malloc(sizeof(TreeNode));
        T->val = ch;
        T->left = CreateBiTree();
        T->right = CreateBiTree();
    }
    return T;//返回根节点
}

测试图像:
微信截图_20160822110832.png-33.3kB
测试结果:
微信截图_20160822111005.png-16.3kB

三、二叉树的遍历

序是根据树根的遍历位置来说的,前序就是先遍历根,后遍历左右子节点
比如这样的树
A
/ \
B C
根是A,前序遍历就是ABC,中序就是BAC,后序就是BCA,根据A的位置决定

3.1 前序遍历

void PreOrderTraverse(TreeNode* T)
{
    if (T)
    {
        printf("%c", T->val);
        PreOrderTraverse(T->left);
        PreOrderTraverse(T->right);
    }
}

3.2 中序遍历

//中序遍历二叉树
void MidOrderTraverse(TreeNode* T)
{
    if (T)
    {
        MidOrderTraverse(T->left);
        printf("%c->", T->val);
        MidOrderTraverse(T->right);
    }
}

3.3 后序遍历

//后序遍历二叉树
void BackOrderTraverse(TreeNode* T)
{
    if (T)
    {
        BackOrderTraverse(T->left);
        BackOrderTraverse(T->right);
        printf("%c->", T->val);

    }
}

3.4二叉树的层次遍历

采用层次遍历的方式递归遍历二叉树的所有元素;

void levelTraverse(TreeNode* T) 
{  
    vector<TreeNode*> vec;  
    vec.push_back(T);  
    int cur = 0;  
    int end = 1;  
    while (cur < vec.size()) 
    {  
        end = vec.size();  
        while (cur < end)
        {  
            cout << vec[cur]->data << " ";  
            if (vec[cur]->lchild)  
                vec.push_back(vec[cur]->lchild);  
            if (vec[cur]->rchild)  
                vec.push_back(vec[cur]->rchild);  
            cur++;  
        }  
        cout << endl;  
    }  
}  

运行结果如下图所示:
微信截图_20160822114201.png-5.1kB

四、二叉树的最大深度

给定一个二叉树,其最大深度指的是根节点到所有叶子节点中的最大距离。同样采用递归的方式遍历二叉树,没遍历一次,计数器+1;

 int maxDepth(TreeNode *root) 
    {
        // write your code here
        if(root == NULL)
        {
            return 0;
        }

        int max_left=1;
        int max_right=1;

        if(root->left != NULL)
        {
            max_left = maxDepth(root->left) + 1;
        }
        if(root->right != NULL)
        {
            max_right = maxDepth(root->right) + 1;
        }
        return max_left>max_right?max_left:max_right;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值