树形结构

(一)二叉树

1.满二叉树:每个节点要么有两个子节点要么没有(要么没有孩子,有就有两个)

2.完全二叉树:只要有一层节点不是满节点,空节点的位置只能是右边的节点没有孩子

3.完美二叉树:每一层的节点都是满的,没有一个空位置

性能(时间复杂度):链表 < 普通二叉树 < 满二叉树 < 完全二叉树 < 完美二叉树


(二)编程实现

1.二叉树节点的创建

2.二叉树的遍历

(1)递归遍历:前、中、后序

  • 可能出现栈溢出

(2)迭代遍历:前、中、后序、层序

  • 用软件栈实现硬件栈功能,可以防止栈溢出

3.二叉树的查找与插入


C++实现

#include <iostream>
#include <stack>
#include <queue>using namespace std;template<class Elem>
struct BinNode{Elem data;BinNode<Elem>* left;BinNode<Elem>* right;BinNode(Elem x){data = x;left = right = NULL;}};template<class Elem>
class BinTree{public:BinNode<Elem>* root;void pre(BinNode<Elem>* root);void ipre(BinNode<Elem>* root);void mid(BinNode<Elem>* root);void imid(BinNode<Elem>* root);void pos(BinNode<Elem>* root);void ipos(BinNode<Elem>* root);void lay(BinNode<Elem>* root);BinNode<Elem>* find(Elem p,BinNode<Elem>* root);public:BinTree(){ root = NULL; };BinTree(Elem x){root = new BinNode<Elem>(x);}~BinTree(){}void preOrderTraversal();void midOrderTraversal();void posOrderTraversal();void layOrderTraversal();bool insert(Elem p,int LR,int data);
};//前序递归:递和归(有去有回)
template<class Elem>
void BinTree<Elem>::pre(BinNode<Elem>* root){if(root == NULL)return;cout << root->data << " ";pre(root->left);pre(root->right);
}//前序迭代(用栈数据结构实现):按顺序入栈,直到走不通出栈(入栈、出栈顺序按照前序方式)
template<class Elem>
void BinTree<Elem>::ipre(BinNode<Elem>* root) {stack<BinNode<Elem>*> st;while(root){cout << root->data << " ";st.push(root);root = root->left;//不断判断节点是否为空(节点访问到头,回到前一个节点再判断)while(root == NULL && !st.empty()){root = st.top();st.pop();root = root->right;}}
}//前序遍历
template<class Elem>
void BinTree<Elem>::preOrderTraversal(){cout << "1.递归方法:";pre(root);cout <<endl;cout << "2.迭代方法:";ipre(root);
}//中序递归
template<class Elem>
void BinTree<Elem>::mid(BinNode<Elem>* root){if(root == NULL)return;mid(root->left);cout << root->data << " ";mid(root->right);}//中序迭代
template<class Elem>
void BinTree<Elem>::imid(BinNode<Elem>* root){stack<BinNode<Elem>*> st;while(root){st.push(root);root = root->left;while(root == NULL && !st.empty()){root = st.top();st.pop();cout << root->data <<" ";root = root->right;}}}//中序遍历
template<class Elem>
void BinTree<Elem>::midOrderTraversal(){cout << "1.递归方法:";mid(root);cout <<endl;cout << "2.迭代方法:";imid(root);
}//后序递归
template<class Elem>
void BinTree<Elem>::pos(BinNode<Elem>* root){if(root == NULL)return;pos(root->left);pos(root->right);cout << root->data << " ";}//后序迭代
template<class Elem>
void BinTree<Elem>::ipos(BinNode<Elem>* root){stack<BinNode<Elem>*> st;BinNode<Elem>* pre = NULL;while(root){st.push(root);root = root->left;while(root == NULL && !st.empty()){root = st.top();if(pre == root->right || !root->right){st.pop();cout << root->data << " ";}pre = root;root = root->right;}}}//后序遍历
template<class Elem>
void BinTree<Elem>::posOrderTraversal(){cout << "1.递归方法:";pos(root);cout <<endl;cout << "2.迭代方法:";ipos(root);}//层序遍历(用队列实现)
template<class Elem>
void BinTree<Elem>::lay(BinNode<Elem>* root){queue<BinNode<Elem>*> q;q.push(root);while(root){cout << root->data << " ";if(root->left)q.push(root->left);if(root->right)q.push(root->right);q.pop();root = q.front();}}template<class Elem>
void BinTree<Elem>::layOrderTraversal(){lay(root);
}template<class Elem>
BinNode<Elem>* BinTree<Elem>::find(Elem p,BinNode<Elem>* root){BinNode<Elem>* temp = NULL;if(root == NULL)temp = NULL;if(root->data == p)return root;temp = find(p,root->left);return temp ? temp : find(p,root->right);}template<class Elem>
bool BinTree<Elem>::insert(Elem p,int LR,int data){bool flag = false;BinNode<Elem>* temp = find(p,root);BinNode<Elem>* node = new BinNode<Elem>(data);if(temp){if(LR == 0){if(temp->left == NULL){temp->left = node;flag = true;}}if(LR == 1){if(temp->right == NULL){temp->right = node;flag = true;}}}return flag;
}int main(int argc,const char *argv[]){BinTree<int> r(1);/*BinNode<int>* node1 = new BinNode<int>(2);BinNode<int>* node2 = new BinNode<int>(3);BinNode<int>* node3 = new BinNode<int>(4);BinNode<int>* node4 = new BinNode<int>(5);node1->left = node3;node2->right = node4;r.root->left = node1;r.root->right = node2;*/r.insert(1,0,2);r.insert(1,0,3);r.insert(1,1,3);r.insert(2,0,4);r.insert(2,1,5);r.insert(4,0,6);cout << "前序遍历"<<endl;r.preOrderTraversal();cout << endl;cout << "中序遍历"<<endl;r.midOrderTraversal();cout << endl;cout << "后序遍历"<<endl;r.posOrderTraversal();cout << endl << endl;cout << "层序遍历:";r.layOrderTraversal();return 0;
}

C实现

#include <stdio.h>
#include <stdlib.h>#define Elem inttypedef struct BinNode{Elem data;struct BinNode* left;struct BinNode* right;
}BinNode;void init(BinNode** root,Elem data){*root = (BinNode*)malloc(sizeof(BinNode));(*root)->data = data;(*root)->left = NULL;(*root)->right = NULL;
}BinNode* find(BinNode* root,Elem p){BinNode* temp = NULL;if(root == NULL)temp = NULL;else{if(root->data == p)temp = root;else{temp = find(root->left,p);return temp ? temp:find(root->right,p);}}return temp;}int insert(BinNode* root,Elem p,int LR,Elem data){int flag = -1;BinNode* temp = find(root,p);BinNode* node = (BinNode*)malloc(sizeof(BinNode));node->data = data;node->left = NULL;node->right = NULL;if(temp == NULL)flag = -1;else{if(LR == 0){if(temp->left == NULL){temp->left = node;flag = 0;}}else{if(temp->right == NULL){temp->right = node;flag = 0;}}}return flag;}//前序遍历:中、左、右
void preOrderTraversal(BinNode* root){if(root == NULL)return;printf("%d",root->data);preOrderTraversal(root->left);preOrderTraversal(root->right);}//中序遍历:左、中、右
void midOrderTraversal(BinNode* root){if(root == NULL)return;midOrderTraversal(root->left);printf("%d",root->data);midOrderTraversal(root->right);
}//后序遍历:左、右、中
void posOrderTraversal(BinNode* root){if(root == NULL)return;posOrderTraversal(root->left);posOrderTraversal(root->right);printf("%d",root->data);
}int main()
{/*  Write C code in this online editor and run it. */BinNode* root;init(&root,1);insert(root,1,0,2);insert(root,1,1,3);insert(root,2,0,4);preOrderTraversal(root);printf("\n");midOrderTraversal(root);printf("\n");posOrderTraversal(root);return 0;
}

数据结构与算法-二叉树相关推荐

  1. 数据结构与算法--二叉树第k个大的节点

    二叉树第k个大的节点 二叉树文章列表: 数据结构与算法–面试必问AVL树原理及实现 数据结构与算法–二叉树的深度问题 数据结构与算法–二叉堆(最大堆,最小堆)实现及原理 数据结构与算法–二叉查找树转顺 ...

  2. 数据结构与算法-- 二叉树中和为某一值的路径

    二叉树中和为某一值的路径 题目:输入一颗二叉树和一个整数,打印出二叉树中节点值的和为给定值的所有路径.从树的根节点开始往下一只到叶子节点所经过的节点形成一条路径. 我们用二叉树节点的定义沿用之前文章中 ...

  3. 数据结构与算法-- 二叉树后续遍历序列校验

    二叉树后续遍历序列校验 题目:输入一个整数数组,判断改数组是否是某个二叉搜索树的后续遍历结果,如果是返回true否则false,假设输入数组的任意两个数字不相同. 例如输入{5,7,6,9,11,10 ...

  4. javascript数据结构与算法--二叉树遍历(中序)

    javascript数据结构与算法--二叉树遍历(中序) 中序遍历按照节点上的键值,以升序访问BST上的所有节点 代码如下: /**二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中*** ...

  5. 数据结构与算法 -- 二叉树 ADT

    树的类型有很多,这里我们只讲二叉树. 一.二叉树的基本概念 1.什么是二叉树 在计算机科中,二叉树是每个节点最多有两个子树的树结构.通常子树被称作"左子树"和"右子树&q ...

  6. 数据结构与算法--二叉树的深度问题

    二叉树的深度 题目:输入一颗二叉树的根,求该树的深度.从根节点到叶子节点一次进过的节点形成的一条路径,最长的路径的长度为树的深度. 如下图中二叉树的额深度4,因为从根节点A到叶子节点的路径中有4个节点 ...

  7. 数据结构与算法--二叉树实现原理

    二叉树 二叉树(binary tree)是一棵树,其中每个节点都不能有多于两个的子节点 二叉树的一个性质是一颗平均二叉树的深度要比节点个数N小得多(重点),对二叉树的分析得出其平均深度为O(N\sqr ...

  8. 数据结构与算法-二叉树(java描述)

    一.概述 1.1.树的概念 树状图是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合.把它叫做"树"是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而 ...

  9. 数据结构与算法——二叉树、堆、优先队列

    *************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 七 ...

  10. 树的基本概念和遍历规则 数据结构和算法 二叉树遍历(前序、中序、后序、层次、深度优先、广度优先遍历)

    zsychanpin 博客园 首页 新随笔 联系 订阅 管理 树的基本概念和遍历规则 树的递归定义 树是n(n>0)个结点的有限集,这个集合满足下面条件:       ⑴有且仅有一个结点没有前驱 ...

最新文章

  1. 计算机科学与技术专业认证研讨,信息学院召开计算机科学与技术专业IEET认证暨人才培养方案修订研讨会...
  2. SpringBoot之get请求404
  3. 计算机里面照片无法打卡,为什么电脑照片打不开_电脑照片打不开的解决方法...
  4. VRRP与VLAN实验(HuaWei)
  5. 使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程
  6. Scrum Guides 2017年最新修改
  7. vue实现两重列表集合,点击显示,点击隐藏的折叠效果,(默认显示集合最新一条数据,点击展开,显示集合所有数据)...
  8. 挖矿赚加密货币?不如出租GPU计算机获取加倍的利润
  9. Win10系统怎么看隐藏文件夹
  10. 免疫算法(Immune Algorithm)详解
  11. java做http接口
  12. 【嵌入式模块】DS18B20 数字温度传感器
  13. 1210_MISRA_C规范学习笔记_指针使用的规范性
  14. 《马克思主义基本原理》复习整理
  15. redis6源码阅读之八(rax)
  16. mac 系统 突破百度网盘网速限制
  17. 【C++学习笔记】函数返回和函数重载
  18. office2016 使用KMS破解无法连接服务器
  19. 基于slurm框架的GPU服务器集群搭建方法
  20. oracle限定词,ORACLE诊断事件

热门文章

  1. 如何使用视频压缩软件,压缩视频大小 ?
  2. 华为m6更新鸿蒙吗,华为手机升级鸿蒙的方法,有哪位升级成功的吗?
  3. 学计算机的要做文档吗,电脑自学
  4. 三星S7edge从8.0降到6.0.1,只为流畅的飞一般的感觉
  5. Python基础+进阶(万字总结,基础案例+执行结果)
  6. 学习线性代数-行列式 笔记(一)
  7. UBUNTU系统镜像定制
  8. 用echarts写潮汐表,并处理后端传来的数据为潮汐表接口的数据
  9. 企业微信机器人脚本python_python3 企业微信机器人发送图片
  10. Linux(一): 磁盘分区