二叉树的相关操作(二)
上次的文章里我们实现了二叉树的基本操作,接下类我们来研究一些其他有意思的操作,包括:
1,通过遍历序列来构建二叉树
2,实现二叉树的层次遍历法
3,判断二叉树是否为完全二叉树
4,实现求二叉树上某节点的双亲
一,
首先,我们来看怎么通过遍历序列(前、中序遍历)来构建二叉树,以往我们构建二叉树的方式是递归输入元素的值,用空格来判断叶节点,而遍历序列的特点是前序遍历的第一个元素是根节点的值,该值会将中序遍历序列分成两段,且分别是左子树和右子树的遍历序列。当我们递归这个过程时,就可以实现二叉树的构建。代码如下:
BiTree CreateTree(TElemType A[],TElemType B[],int ha,int la,int hb,int lb)
{ if(A == NULL || B == NULL || ha>la || hb>lb) return NULL;char ch = A[ha];int k=hb;while(B[k] != ch) k++;BiTree T = (BiTree)malloc(sizeof(BiTNode));T->data = ch;T->lchild = CreateTree(A,B,ha+1,ha+k-hb,hb,k);T->rchild = CreateTree(A,B,ha+k+1-hb,la,k+1,lb);return T;
}
二,
层次遍历的特点是每层元素从左到右依次遍历,问题在于怎么实现保存当前元素值,当层数发生变化时遍历已经保存的数据。事实上,这一步可以用队列这样实现:初始将根节点入队,每回合出队一个元素,左右子树非空时分别将其入队,这样就可以从宏观上实现任意一个节点的后面一个元素一定是它的 “右” 节点。最终代码如下:
Status LevelOrderTraverse(BiTree T,void(*Visit)(TElemType))
{ if(!T) return OK;LinkQueue Q;InitQueue(Q);EnQueue(Q,T);while(!QueueEmpty(Q)){BiTree p;DeQueue(Q,p);visit(p->data);if(p->lchild)EnQueue(Q,p->lchild);if(p->rchild)EnQueue(Q,p->rchild);}return OK;
}
三,
判断完全二叉树的核心思路是递归:当左右子树均为完全二叉树时,原二叉树 “基本上” 是完全二叉树,例外是一边为空,另一边深度大于一,其他的就完全是递归的事情了,边界条件是:空树、一边为空另一边深度为一、两边深度均为一,这三种情况均是完全二叉树。最后的代码如下:
Status IsCompleteTree(BiTree T)
{ if(!T) return TRUE;//空树else{if(!T->lchild && !T->rchild) return TRUE;else{if((!T->lchild && DepOfTree(T->rchild)==1)||(!T->rchild && DepOfTree(T->lchild)==1))return TRUE;else if((!T->lchild && DepOfTree(T->rchild)>1)||(!T->rchild && DepOfTree(T->lchild)>1))return FALSE;else if(T->lchild && T->rchild){if(IsCompleteTree(T->lchild) && IsCompleteTree(T->rchild)) return TRUE;else return FALSE;}}}
}
其中的DepOfTree为求二叉树深度的函数,在上篇文章中已实现。
四,
直接求父节点有困难,考虑最简单的情况:树的深度只有一时,目标节点为子节点,那么所求双亲结点显然是根节点。稍加思索便知,这便是递归的边界条件之一,此外还有空树无父节点的情况。那么递归的一般公式是什么呢?如果树的深度大于一,那么递归左右子树判断上述条件即可,这便是递归的一般公式。代码如下:
BiTree ParentNode(BiTree T,TElemType e)/* 在树T中返回e的父节点 */
{if(!T)return NULL;if(T->data == e){printf("该节点为根节点,无双亲\n");return NULL;}if((T->lchild && T->lchild->data == e) || (T->rchild && T->rchild->data == e))return T;else{if(ParentNode(T->lchild,e))return ParentNode(T->lchild,e);else if(ParentNode(T->rchild,e))return ParentNode(T->rchild,e);else{return NULL;}}
}
That's all. Thanks!
二叉树的相关操作(二)相关推荐
- C语言 二叉树的相关操作
C语言 二叉树的相关操作 // 头文件 #ifndef __BITREE_H__ #define __BITREE_H__ #define _CRT_SECURE_NO_WARNINGS #inclu ...
- 【数据结构】二叉树及其相关操作
二叉树的定义 二叉树是一个由结点构成的有限集合,这个集合或者为空,或者由一个根节点及两棵互不相交的分别称作这个根节点的左子树和右子树的二叉树组成. 二叉树并非一般的树形结构的特殊形式,它们是两种不同的 ...
- 二叉树的相关操作(c语言)
二叉树的相关操作:包括先序序列+中序序列建树丶后序序列+中序序列建树丶层次序列+中序序列建树:先序遍历丶中序遍历丶后序遍历丶层次遍历:二叉树的深度及最大宽度:度分别为0,1,2的节点个数以及总结点个数 ...
- GIt本地相关操作(一)
最近项目中开始使用git,之前都是用svn来对项目代码进行版本控制.因此git对笔者来说比较陌生,故此通过记录学习git详细过程,与大家进行分享.由于是第一次写,git也是初学,其中难免出现自己理解的 ...
- Python之数据分析(Numpy的矩阵相关操作、ufunc泛化函数对象)
文章目录 一.矩阵相关操作 二.ufunc统一泛化函数 一.矩阵相关操作 1.三种构造矩阵的方法 np.matrix(二维容器, copy=True) 一参为可被解释为矩阵的二维容器,比如二维数组.二 ...
- 数据结构源码笔记(C语言):二叉平衡树的相关操作算法
//二叉平衡树的相关运算 #include<stdio.h> #include<malloc.h> #include<string.h>typedef char I ...
- 面试基础算法及编程 第三弹(树(二叉树)相关:主要考察指针相关的操作)
// # -*- coding:utf-8 -*- // # @Author: Mr.chen(ai-chen2050@qq.com) // # @Date: 2018-08-17 16:32:55 ...
- php 空二位数组,php对二维数组进行相关操作(排序、转换、去空白等),php二维数组_PHP教程...
function printr($arr) { echo ''; print_r($arr); echo ' '; } 第一组 :sort 和 rsort,按照PHP数组键值的顺序asc和逆序desc ...
- 基于C#的AE二次开发之图层右键菜单打开属性表及图层相关操作
基于C#的AE二次开发之图层右键菜单打开属性表及图层相关操作 我的开发环境为ArcGIS Engine 10.2与Visual studio2010.主地图名称为axMapControl1,Toc目录 ...
最新文章
- 学习python自动化运维笔记文件比较
- SAP系统和微信集成的系列教程之九:如何将微信用户发送给微信公众号的内容自动转存到SAP C4C系统
- 装上了Visual Studio 2005
- React开发(178):ant design table基础用法
- mysql myisam/innodb高并发优化经验_MySQL MyISAM / PHP 高并发优化经验
- 谈一谈Java编程开发中的并发控制
- linux dhcp 负载均衡,dhcp双机负载均衡
- java的关键字和保留字_Java关键字和保留字及其含义
- 5G 背面:物联网的变局!
- iOS 处理pfx文件
- mvc 调试 f12 浏览器闪退
- 史上最管用的C盘深度清理秘籍
- pytorch版crnn网络框架
- 设置桌面上计算机的图标更改,电脑如何修改桌面应用的图标
- 参考文献格式字号字体_参考文献标准格式字体
- 佛系前端面试题记录--第三周
- MongoDB学习笔记之索引(一)
- 在HTML中禁止IE缓存
- hadoop、hive搭建
- 汽车电子控制器的硬件测试