数据结构 树

树定义

定义

  1. 树是一种常用的非线性结构,其递归定义如下:
    树是n(n>=0)个结点的有限集合。若n=0,则称为空树,否则,有且仅有一个特定的结点被称为根,当n>1时,其余结点被分为m个互不相交的子集,每个子集又是一棵树。
  2. 常见树结构
    组织机构关系
    血缘关系
    树的组织
    文件系统

基本概念

  1. 结点
    数据元素的内容及其指向其子树根的分支统称为结点。
  2. 结点的度
    一个结点所拥有的分支数。
  3. 树的度
    所有结点的度的最大值。
  4. 终端结点(叶子)
    度为0的结点。
  5. 非终端结点
    度不为0的结点。
  6. 结点的层次
  7. 树的深度
  8. 有序树、无序树
    如果树中每棵子树从左向右的排列拥有一定的顺序,不得互换,则称为有序树,否则为无序树。

二叉树

二叉树定义

  1. 二叉树是另一种树形结构
  2. 二叉树与树形结构的区别
    每个节点最多有两颗子树
    子树有左右之分
  3. 二叉树的递归定义
    二叉树是n(n>=0)个结点的有限集合。当n=0时,称为空二叉树;当n》0时,有且仅有一个结点为二叉树的根,其余结点被分两个不相交的子集,一个为左子集一个为右子集。
    在这里插入图片描述
  4. 满二叉树
    在这里插入图片描述
  5. 完全二叉树
    在这里插入图片描述

存储结构

  1. 用一组连续的存储单元按照完全二叉树的每个结点编号的顺序存放结点内容。
    在这里插入图片描述
  2. 二叉树的链式存储结构
    顺序存储的不足
    ① 对于非完全二叉树,进行顺序存储需要将空缺的位置用特定的符号填补,如果空缺结点较多,则导致空间利用率下降;
    ② 仅适用于完全二叉树。
    链式存储
    二叉链表
    在这里插入图片描述
    三叉链表
    在这里插入图片描述
  3. 链式存储结构描述
//二叉链表存储
typedef struct bbtnode{
	ElemType data;
	struct bbtnode *lchild,*rchild;
}bbtnode;
//三叉链表存储
typedef struct tbtnode{
	ElemType data;
	struct tbtnode *parent;
	struct tbtnode *lchild,*rchild;
}tbtnode;

在这里插入图片描述

二叉树的遍历

  1. 二叉树是一种非线性的数据结构,在对它进行操作时,需要逐一对每个数据元素实施操作。
  2. 所谓遍历二叉树就是按照某种顺序访问二叉树中的每一个结点一次且仅一次,的过程。这里的访问可以是输出、比较、更新、查看元素内容等等操作。
    ① 遍历操作实际上是将非线性结构线性化的过程;
    ② 遍历操作是一个递归的过程。
  3. 二叉树的遍历方式分为两大类
    ① 按照根、左子树、右子树三部分进行访问:先序遍历;中序遍历;后续遍历;
//先序遍历
void preorder(bbtnode *BT){
	if(BT){
		visit(BT);
		preorder(BT->lchild);
		preorder(BT->rchild);
	}
}
//中序遍历
void inorder(bbtnode *BT){
	if(BT){
		inorder(BT->lchild);
		visit(BT);
		inorder(BT->rchild);
	}
}
//后续遍历
void postorder(bbtnode *BT){
	if(BT){
		postorder(BT->lchild);
		postorder(BT->rchild);
		visit(BT);
	}
}

② 按照层次进行访问

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
    	//二维数组ret用存放结果
        vector <vector <int>> ret;
        //判断是否为空树
        if (!root) return ret;
        //定义一个队列存放Treenode的指针
        queue <TreeNode*> q;
        //将根元素压入队列
        q.push(root);
        while (!q.empty()) {
        	//当前层数
            int currentLevelSize = q.size();
            //先放入一个动态数组
            ret.push_back(vector <int> ());
            //进入循环
            for (int i = 1; i <= currentLevelSize; ++i) {
            	//auto类型得到队列中指针元素
                auto node = q.front();
                //出队
                q.pop();
                //ret容器存入当前结果
                //back()得到数组的最后一个单元的引用
                ret.back().push_back(node->val);
                //队列中加入上一个结点的左右孩子
                if (node->left) q.push(node->left);
                if (node->right) q.push(node->right);
            }
        }        
        return ret;
    }
};
  1. 统计叶子结点个数

//统计叶子结点数
int n2=0;
void countLeafNode(BTNode *p)
{
    if(p!=NULL)
    {
        if(p->lchild==NULL&&p->rchild==NULL)//判断是否叶子结点
            ++n2;
        countLeafNode(p->lchild);
        countLeafNode(p->rchild);
    }
}

  1. 计算二叉树的高度
int height(bbtnode* BT){
	if(BT==NULL){ 
	return 0;
	}else{
		hl=height(BT->lchild);
		hr=height(BT->rchild);
		return max{hl,hr}+1
	}
	
}
  1. 交换二叉树左右子树
void exchange(bbtnode* BT){
	if(BT){
		temp=BT->lchild;
		BT->lchild=BT->rchild;
		BT->rchild=temp;
		exchange(BT->lchild);
		exchange(BT->rchild);
	}
}
展开阅读全文

图解Java数据结构和算法

06-21
1.算法是程序的灵魂,优秀的程序在对海量数据处理时,依然保持高速计算,就需要高效的数据结构和算法支撑。2.网上数据结构和算法的课程不少,但存在两个问题:1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了2)说是讲数据结构和算法,但大多是挂羊头卖狗肉,算法讲的很少。 本课程针对上述问题,有针对性的进行了升级 3)授课方式采用图解+算法游戏的方式,让课程生动有趣好理解 4)系统全面的讲解了数据结构和算法, 除常用数据结构和算法外,还包括程序员常用10大算法:二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、马踏棋盘算法。可以解决面试遇到的最短路径、最小生成、最小连通图、动态规划等问题及衍生出的面试题,让你秒杀其他面试小伙伴3.如果你不想永远都是代码工人,就需要花时间来研究下数据结构和算法。教程内容:本教程是使用Java来讲解数据结构和算法,考虑到数据结构和算法较难,授课采用图解加算法游戏的方式。内容包括: 稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序、排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、二叉、二叉与数组转换、二叉排序(BST)、AVL、线索二叉、赫夫曼、赫夫曼编码、多路查找(BB+和B*)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法。学习目标:通过学习,学员能掌握主流数据结构和算法的实现机制,开阔编程思路,提高优化程序的能力。

java数据结构算法

11-22
做一门精致,全面详细的 java数据结构与算法!!! 让天下没有难学的数据结构, 让天下没有难学的算法, 不吹不黑,我们的讲师及其敬业,可以看到课程视频,课件,代码的录制撰写,都是在深夜,如此用心,其心可鉴,他不掉头发,谁掉头发??? 总之你知道的,不知道的,我们都讲,并且持续更新,走过路过,不要错过,不敢说是史上最全的课程,怕违反广告法,总而言之,言而总之,这门课你值得拥有,好吃不贵,对于你知识的渴求,我们管够管饱 话不多说,牛不多吹,我们要讲的本门课程内容: 稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序、排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、二叉、二叉与数组转换、二叉排序(BST)、AVL、线索二叉、赫夫曼、赫夫曼编码、多路查找(BB+和B*)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法。

通俗易懂的数据结构和算法教程(含配套资料)

07-20
本教程为授权出品 课程介绍: 1.算法是程序的灵魂,优秀的程序在对海量数据处理时,依然保持高速计算,就需要高效的数据结构和算法支撑。 2.网上数据结构和算法的课程不少,但存在两个问题: 1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了 2)说是讲数据结构和算法,但大多是挂羊头卖狗肉,算法讲的很少。 本课程针对上述问题,有针对性的进行了升级  3)授课方式采用图解+算法游戏的方式,让课程生动有趣好理解  4)系统全面的讲解了数据结构和算法, 除常用数据结构和算法外,还包括程序员常用10大算法:二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、马踏棋盘算法。可以解决面试遇到的最短路径、最小生成、最小连通图、动态规划等问题及衍生出的面试题,让你秒杀其他面试小伙伴 3.如果你不想永远都是代码工人,就需要花时间来研究下数据结构和算法。 教程内容: 本教程是使用Java来讲解数据结构和算法,考虑到数据结构和算法较难,授课采用图解加算法游戏的方式。内容包括: 稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序、排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、二叉、二叉与数组转换、二叉排序(BST)、AVL、线索二叉、赫夫曼、赫夫曼编码、多路查找(BB+和B*)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法。 学习目标: 通过学习,学员能掌握主流数据结构和算法的实现机制,开阔编程思路,提高优化程序的能力。

内功修炼之数据结构与算法

05-28
内容简介: 无论你是从事业务开发,还是从事架构设计,想要优化设计模式,数据结构与算法是必备的一门学科,本课程使用Java来讲解数据结构和算法, 考虑到数据结构和算法较难,授课采用图解加算法游戏的方式。 内容包括: 稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、 递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序、 排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、二叉、二叉与数组转换、二叉排序(BST)、AVL、线索二叉、赫夫曼、赫夫曼编码、 多路查找(BB+和B*)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、 克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法。 为什么学数据结构与算法? 算法是一个程序员真正的核心竞争力。无论用哪种语言做开发,算法从程序角度而言都是灵魂内核般的存在。 程序的躯体可以各式各样,但是内核一定要追求高效整洁。 同时掌握了算法,大厂名企的Offer不再是梦寐以求的梦想,而让程序高效且健壮,也不再是难以完成的技术难题。 所以无论是为提升自我内功修炼,还是提升程序灵魂内核健全,学习算法,都是现有可供选项里的最优解。 课程大纲: 为了让大家快速系统了解数据结构与算法知识全貌,我为你总结了「数据结构与算法框架图」,帮你梳理学习重点,建议收藏!! CSDN学院Java答疑群:
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值