博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构开发(22):二叉树的转换、深层特性与存储结构设计
阅读量:5143 次
发布时间:2019-06-13

本文共 4513 字,大约阅读时间需要 15 分钟。

0.目录

1.

2.

3.

4.

1.树到二叉树的转换

通用树结构的回顾:

  • 双亲孩子表示法
    1. 每个结点都有一个指向其双亲的指针
    2. 每个结点都有若干个指向其孩子的指针

1250397-20181222153235896-763937392.png

另一种树结构模型:

  • 孩子兄弟表示法
    1. 每个结点都有一个指向其第一个孩子的指针
    2. 每个结点都有一个指向其第一个右兄弟的指针

1250397-20181222153257965-1328465302.png

孩子兄弟表示法的特点:

  1. 能够表示任意的树形结构
  2. 每个结点包含一个数据成员和两个指针成员
  3. 孩子结点指针和兄弟结点指针构成了“树权”

二叉树的定义:

  • 二叉树是由 n ( n ≥ 0 ) 个结点组成的有限集合,该集合或者为空,或者是由一个根结点加上两棵分别称为左子树右子树的、互不相交的二叉树组成。

二叉树的5种形态:

1250397-20181222153322926-89320020.png

特殊的二叉树:

  • 满二叉树 (Full Binary Tree)
    1. 如果二叉树中所有分支结点的度数都为 2,且叶子结点都在同一层次上,则称这类二叉树为满叉树。
  • 完全二叉树 (Complete Binary Tree)
    1. 如果一棵具有 n 个结点的高度为 k 的二叉树,它的每一个结点都与高度为 k 的满二叉树中编号为 1 — n 的结点一一对应,则称这棵二叉树为完全二叉树。( 从上到下从左到右编号 )

完全二叉树的特性:

  • 同样结点数的二叉树,完全二叉树的高度最小
  • 完全二叉树的叶结点仅出现在最下面两层
    1. 最底层的叶结点一定出现在左边
    2. 倒数第二层的叶结点一定出现在右边
    3. 完全二叉树中度为 1 的结点只有左孩子

1250397-20181222153409504-1812726086.png

2.二叉树的深层特性

性质1:

1250397-20181222153434621-651494316.png

性质2:

1250397-20181222153507469-923670750.png

性质3:

1250397-20181222153514001-2016941105.png

性质4:

1250397-20181222153521799-1064142556.png

性质5(这一条性质为完全二叉树所特有,普通二叉树不具备。):

1250397-20181222153527471-1427876060.png

3.二叉树的存储结构设计

本节目标:

  • 完成二叉树二叉树结点的存储结构设计

1250397-20181222153657462-1453892424.png

设计要点:

  • BTree 为二叉树结构,每个结点最多只有两个后继结点
  • BTreeNode 只包含 4 个固定的公有成员 ( 哪4个? )
  • 实现树结构的所有操作 ( 增,删,查,等 )

BTreeNode 的设计与实现:

1250397-20181222153722643-1229952403.png

BTree 的设计与实现:

1250397-20181222153733917-473752853.png

BTree ( 二叉树结构 ) 的实现架构:

1250397-20181222153743691-1213695635.png

重构父类TreeNode类和Tree类:

TreeNode.h

#ifndef TREENODE_H#define TREENODE_H#include "Object.h"namespace StLib{template 
class TreeNode : public Object{protected: bool m_flag; TreeNode(const TreeNode
&); TreeNode
& operator = (const TreeNode
&); void* operator new(size_t size) throw() { return Object::operator new(size); }public: T value; TreeNode
* parent; TreeNode() { m_flag = false; parent = NULL; } bool flag() { return m_flag; } virtual ~TreeNode() = 0;};template
TreeNode
::~TreeNode(){}}#endif // TREENODE_H

Tree.h

#ifndef TREE_H#define TREE_H#include "TreeNode.h"#include "SharedPointer.h"namespace StLib{template 
class Tree : public Object{protected: TreeNode
* m_root; Tree(const Tree
&); Tree
& operator = (const Tree
&);public: Tree() { m_root = NULL; } virtual bool insert(TreeNode
* node) = 0; virtual bool insert(const T& value, TreeNode
* parent) = 0; virtual SharedPointer< Tree
> remove(const T& value) = 0; virtual SharedPointer< Tree
> remove(TreeNode
* node) = 0; virtual TreeNode
* find(const T& value) const = 0; virtual TreeNode
* find(TreeNode
* node) const = 0; virtual TreeNode
* root() const = 0; virtual int degree() const = 0; virtual int count() const = 0; virtual int height() const = 0; virtual void clear() = 0;};}#endif // TREE_H

修改对应的GTreeNode类:

GTreeNode.h

#ifndef GTREENODE_H#define GTREENODE_H#include "TreeNode.h"#include "LinkList.h"namespace StLib{template 
class GTreeNode : public TreeNode
{public: LinkList
*> child; static GTreeNode
* NewNode() { GTreeNode
* ret = new GTreeNode
(); if( ret != NULL ) { ret->m_flag = true; } return ret; }};}#endif // GTREENODE_H

在StLib中定义BTreeNode类和BTree类:

BTreeNode.h

#ifndef BTREENODE_H#define BTREENODE_H#include "TreeNode.h"namespace StLib{template 
class BTreeNode : public TreeNode
{public: BTreeNode
* left; BTreeNode
* right; BTreeNode() { left = NULL; right = NULL; } static BTreeNode
* NewNode() { BTreeNode
* ret = new BTreeNode
(); if( ret != NULL ) { ret->m_flag = true; } return ret; }};}#endif // BTREENODE_H

BTree.h

#ifndef BTREE_H#define BTREE_H#include "Tree.h"#include "BTreeNode.h"#include "Exception.h"#include "LinkQueue.h"namespace StLib{template 
class BTree : public Tree
{public: bool insert(TreeNode
* node) { bool ret = true; return ret; } bool insert(const T& value, TreeNode
* parent) { bool ret = true; return ret; } SharedPointer< Tree
> remove(const T& value) { return NULL; } SharedPointer< Tree
> remove(TreeNode
* node) { return NULL; } BTreeNode
* find(const T& value) const { return NULL; } BTreeNode
* find(TreeNode
* node) const { return NULL; } BTreeNode
* root() const { return dynamic_cast
*>(this->m_root); } int degree() const { return NULL; } int count() const { return NULL; } int height() const { return NULL; } void clear() { this->m_root = NULL; } ~BTree() { clear(); }};}#endif // BTREE_H

4.小结

  • 通用树结构采用了双亲结点表示法进行描述
  • 孩子兄弟表示法有能力描述任意类型的树结构
  • 孩子兄弟表示法能够将通用树转化为二叉树
  • 二叉树是最多只有两个孩子的树

转载于:https://www.cnblogs.com/PyLearn/p/10161680.html

你可能感兴趣的文章
Leetcode 54: Spiral Matrix
查看>>
Jmeter深度学习第一天——简单请求、带header请求、返回值乱码问题
查看>>
error C2662 无法将左值绑定到右值 —— 变量永远是左值,即使它的类型为右值引用...
查看>>
C#, CLR, and .NET Framework versions
查看>>
python初识面向对象(一)
查看>>
k8s(6)-滚动更新
查看>>
特殊权限SUID
查看>>
C#获取IP地址
查看>>
Linux:PS命令详解与使用
查看>>
PHP设计模式:值对象模式
查看>>
解决python中csv文件中文写入问题
查看>>
TensorFlow学习资源
查看>>
Openstack(十一)部署网络服务neutron(控制节点)
查看>>
Git命令大全
查看>>
Titanium Studio
查看>>
fullcalendar解决同一时间段存在多个日程
查看>>
华为研发工程师编程题
查看>>
小白大收集:C# 连库字符串详细讲解
查看>>
tls数据包分析
查看>>
luogu1328 [NOIp2014]生活大爆炸版石头剪刀布 (模拟)
查看>>