您的位置:首页 > 其它

二叉树高度、结点个数、判断;

2015-07-17 16:05 204 查看
1、二叉树的高度;

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: