数据结构之二叉树的递归建立和遍历(续)
来源:互联网 发布:豫广网络维修电话 编辑:程序博客网 时间:2024/06/05 16:17
特此说明:上篇文章和这篇文章中的二叉树是链式二叉树的,不是顺序二叉树。
1、基本概述
A、层次遍历
摘自:http://blog.sina.com.cn/s/blog_5207b6c401009fq0.html
要采用的数据结构是队列。具体描述如下:
层次遍历:从上到下、从左到右依次访问结点。每次访问结点,就将该节点记录下来;若记录的所有结点都已经处理完毕,则结束遍历,否则重复下面的重装:
取出记录中第一个还没有访问的树的结点,若他有左子树,则访问左子树,并将其记录下来,否则,访问其右子树,并记录下来。
上面的算法中,记录结点就是入队操作,取出记录结点就是出队操作,这样一来,算法描述成下面的形式:
1)访问根节点,并将其根节点入队;
2)当队列不为空时,重复下列操作:
从队列出队一个结点;
若其有左子树,则访问左子树,并将其入队;
若其有右子树,则访问右子树,并将其入队;
B 、层次遍历
未使用队列完成层次遍历(我放到后面)
2、二叉树的深度计算
关键代码:
/// 二叉树---递归求得其深度int depth(BinTreeNode *T){ if (NULL == T) { return 0; } int leftDepth = depth(T->lchild); int rightDepth = depth(T->rchild); return leftDepth < rightDepth ? leftDepth + 1: rightDepth + 1;}
递归实现求得其深度。
3、二叉树的结点个数统计
关键代码
/// 二叉树统计结点个数int m_count(BinTreeNode *T){ if (NULL != T) { return m_count(T->lchild) + m_count(T->rchild) + 1; } return 0;}递归完成对齐结点个数的统计。
4、层次遍历
注意:这里,不是使用队列完成层次遍历的。
/// 二叉树层次遍历输出void PrintNodeAtLeves(BinTreeNode *T, int level){ /// 空树或层级不合理 if (NULL == T || level < 1) { cout << "空树或者层级不合理" << endl; return; } /// 若只有根节点 if (1 == level) { cout << T->index << " "; return; } /// 左子树的level-1 PrintNodeAtLeves(T->lchild, level - 1); /// 右子树的level-1 PrintNodeAtLeves(T->rchild, level - 1);}/// 二叉树的层次遍历void Level(BinTreeNode *T){ if (NULL == T) { cout << "树T = NULL"; return; } /// 获取树的深度 int m_depth = depth(T); for (int i = 1; i <= m_depth; i++) { PrintNodeAtLeves(T, i); cout << endl; }}
5、层次遍历(未使用队列)完成源码
#include <iostream>using namespace std;
struct BinTreeNode{ int index; BinTreeNode *lchild; BinTreeNode *rchild;};
/// 构建二叉树BinTreeNode *create(BinTreeNode *T){ int input = NULL; cout << "请输入数据:"; cin >> input; if (0 == input) { T = NULL; return T; } T = (BinTreeNode *)malloc(sizeof(BinTreeNode)); if (NULL == T) { cout << "内存分配失败" << endl; exit(1); } T->index = input; T->lchild = create(T->lchild); T->rchild = create(T->rchild); return T;}
/// 二叉树统计结点个数int m_count(BinTreeNode *T){ if (NULL != T) { return m_count(T->lchild) + m_count(T->rchild) + 1; } return 0;}/// 二叉树---递归求得其深度int depth(BinTreeNode *T){ if (NULL == T) { return 0; } int leftDepth = depth(T->lchild); int rightDepth = depth(T->rchild); return leftDepth < rightDepth ? leftDepth + 1: rightDepth + 1;}/// 二叉树层次遍历输出void PrintNodeAtLeves(BinTreeNode *T, int level){ /// 空树或层级不合理 if (NULL == T || level < 1) { cout << "空树或者层级不合理" << endl; return; } /// 若只有根节点 if (1 == level) { cout << T->index << " "; return; } /// 左子树的level-1 PrintNodeAtLeves(T->lchild, level - 1); /// 右子树的level-1 PrintNodeAtLeves(T->rchild, level - 1);}/// 二叉树的层次遍历void Level(BinTreeNode *T){ if (NULL == T) { cout << "树T = NULL"; return; } /// 获取树的深度 int m_depth = depth(T); for (int i = 1; i <= m_depth; i++) { PrintNodeAtLeves(T, i); cout << endl; }}///主函数int main(int argc, const char * argv[]){ /// 二叉树 BinTreeNode *T = NULL; T = CreateBinTree(T); cout << "结点个数" << m_count(T) << endl; cout << "树的深度为:" << depth(T) << endl; cout << "层次遍历" << endl; Level(T); cout << endl;}
6、运行结果:
1 0
- 数据结构之二叉树的递归建立和遍历(续)
- 数据结构之二叉树的递归建立和遍历
- 【数据结构基础】二叉树的建立和递归遍历
- 二叉树的递归建立和遍历
- 数据结构——二叉树的建立和遍历(递归建树&层序遍历建树)
- 数据结构二叉树的建立以及递归遍历
- 数据结构之二叉树遍历(递归和非递归)
- c++ 二叉树 的递归建立和递归遍历
- 二叉树的建立和遍历(递归、非递归)
- 数据结构--------二叉树的建立和前序遍历------递归实现
- 【二叉树的建立和遍历】SDUTOJ 2136---数据结构实验之二叉树的建立与遍历
- 数据结构之二叉树的递归创建、递归遍历
- 递归建立和遍历二叉树等
- 二叉树的建立和遍历(递归)
- c++二叉树的非递归建立和遍历
- 数据结构之二叉树(遍历、建立、深度)
- 数据结构之二叉树(遍历、建立、深度)
- 数据结构之二叉树(遍历、建立、深度)
- 数据库oracle与mysql在语法上的区别
- self.array 和 _array的区别
- IOS 集合视图指南2:集合视图基础
- Android Fragment 你应该知道的一切
- hi3531 添加uart3
- 数据结构之二叉树的递归建立和遍历(续)
- asp 提示 没有权限: 'CreateObject'
- Android-笔记-160506
- java线程——synchronized的4种用法
- SpringMVC-intercepter配置
- 跟我一起学习MySQL技术内幕(第五版):(第三章学习日记2上)
- DP待整理
- Android Fragment 真正的完全解析(下)
- 闭包--javascript深入理解js闭包