二叉树高度、结点个数、判断;
2015-07-17 16:05
204 查看
1、二叉树的高度;
2、二叉树的叶子结点个数;
3、二叉树第k层的节点个数;
4、判断节点是否在二叉树中;
2、二叉树的叶子结点个数;
3、二叉树第k层的节点个数;
4、判断节点是否在二叉树中;
#pragma once #include <vector> #include <queue> #include <iostream> #include <assert.h> using namespace std; typedef char DataType; struct BinaryNode { BinaryNode* _left; BinaryNode* _right; DataType _data; BinaryNode(DataType x) :_left(NULL) ,_right(NULL) ,_data(x) {} }; void CreateBinaryTree(BinaryNode*& root, const vector<DataType>& datas, int & i) { // 前序遍历构建二叉树 if (root == NULL && i < datas.size() && datas[i] != '#') { root = new BinaryNode(datas[i]); CreateBinaryTree(root->_left, datas, ++i); CreateBinaryTree(root->_right, datas, ++i); } } //前序遍历 void PrevTraverse(BinaryNode* root) { if (root) { cout<<root->_data<<" "; PrevTraverse(root->_left); PrevTraverse(root->_right); } } //二叉树的高度 int GetHeight(BinaryNode* root) { if (root == NULL || (root->_left == NULL && root->_right == NULL)) { return 0; } int leftHeight = GetHeight(root->_left); int rightHeight = GetHeight(root->_right); return (leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1); } //二叉树的叶子结点个数 int GetLeafNum(BinaryNode* root) { if (root == NULL) { return 0; } if (root->_left == NULL && root->_right == NULL) { return 1; } return GetLeafNum(root->_left) + GetLeafNum(root->_right); } //二叉树的叶子结点个数 void GetLeafNum_OP1(BinaryNode* root, int& num) { if (root == NULL) { return; } if (root->_left == NULL && root->_right == NULL) { ++num; return; } GetLeafNum_OP1(root->_left, num); GetLeafNum_OP1(root->_right, num); } //二叉树第k层的节点个数 int GetKLevelNum(BinaryNode* root, int k) { if (k < 1 || root == NULL) { return 0; } if (k == 1) { return 1; } return GetKLevelNum(root->_left, k - 1) + GetKLevelNum(root->_right, k - 1); } //判断节点是否在二叉树中 bool IsInTree(BinaryNode* root, BinaryNode *n) { assert(n); if (root != NULL) { if (root->_data == n->_data) { return true; } else { if(IsInTree(root->_left, n)) { return true; } if(IsInTree(root->_right, n)) { return true; } } } return false; }
void Test2() { vector<DataType> v; v.push_back('A'); v.push_back('B'); v.push_back('C'); v.push_back('#'); v.push_back('#'); v.push_back('D'); v.push_back('#'); v.push_back('#'); v.push_back('E'); v.push_back('F'); BinaryNode* root = NULL; int index = 0; CreateBinaryTree(root, v, index); int height = GetHeight(root); cout<<"二叉树的高度:"<<height<<endl; cout<<"二叉树节点个数:"<<GetLeafNum(root)<<endl; int ret = GetKLevelNum(root,3); cout<<"第k层的节点个数"<<ret<<endl; BinaryNode n ='B'; bool ret1 = IsInTree(root,&n); cout<<ret1<<endl; }
相关文章推荐
- STM32 USB虚拟串口移植参考
- (FFOS Gecko) - several ways of exposing a module to navigator
- uboot-README_uboot分析
- CSU1160
- JVM加载class原理
- 链表结构体问题
- 【笔记】ListView的使用
- 设计模式六大原则
- Android 混淆打包,阻止反编译
- 浅谈clientHeight、offsetHeight、scrollHeight的联系与区别
- freemarker中修改和添加功能中包含checkbox复选框默认选中需求的解决方式
- js倒计时天时分秒[转]
- 一个简易makefile教程
- HashMap, TreeMap, Hashtable的区别
- 收藏网站9
- Nginx+Php-fpm+MySQL+Redis源代码编译安装指南
- python中的继承
- 获取多段线的所有顶点
- (cocos2dx)使用__Array容器检测碰撞时间
- JAVE中String.lastIndexOf的用法及延伸