C++算法之 求二叉树的节点个数、深度、四种遍历方法

//节点的数据结构
class BTree
{
public:
 int       m_nValue;
 BTree*    m_nLeft;
 BTree*    m_nRight;
public:
 BTree(int value)
 {
  m_nValue = value;
 }
};

一:求二叉树的节点个数:

/*
求二叉数中的节点个数
递归解法:
1:如果二叉树为空,节点的个数为0
2:如果二叉树不为空,二叉树节点的个数 = 左子树节点个数+右子树节点的个数+1;
*/
int GetNodeCount(BTree* pRoot)
{
	if (pRoot == NULL)
		return 0;

	int LeftNum  =  GetNodeCount(pRoot->m_nLeft);
	int RightNum =  GetNodeCount(pRoot->m_nRight);
	int ret = LeftNum+RightNum+1;
	return ret;

}

二:求二叉树的深度:

/*
求二叉树的深度
递归解法:
1:如果二叉树为空,则二叉树的深度为0
2:如果二叉树不为空,二叉树的深度 = MAX(左子数深度,右子树深度)+1;
*/
int GetTreeDepth(BTree* pRoot)
{
	if (pRoot == NULL)
		return 0;
	int LeftDepth  = GetTreeDepth(pRoot->m_nLeft);
	int RightDepth = GetTreeDepth(pRoot->m_nRight);
	int ret = max(LeftDepth,RightDepth)+1;
	return ret;
}

三:四种遍历方式:

/*
前序遍历:
1:如果二叉树为空,空操作
2:如果二叉树不为空,访问根节点,前序遍历左子树,前序遍历右子树
*/
void PreOrderTraverse(BTree* pRoot)
{
	if (pRoot == NULL)
		return;
	cout<<pRoot->m_nValue<<endl;
	PreOrderTraverse(pRoot->m_nLeft);
	PreOrderTraverse(pRoot->m_nRight);
}
/*
中序遍历:
1:如果二叉树为空,空操作
2:如果二叉树不为空,第一步中序遍历左字树,第二步访问跟节点,第三步中序遍历右子树
*/
void InOrderTraverse(BTree* pRoot)
{
	if (pRoot == NULL)
		return;
	InOrderTraverse(pRoot->m_nLeft);
	cout<<pRoot->m_nValue<<endl;
	InOrderTraverse(pRoot->m_nRight);
}
/*
后序遍历:
1:如果二叉树为空,空操作
2:如果二叉树不为空,第一步后序遍历左子树,第二步后序遍历右子树,第三步访问跟节点;
*/
void BackOrderTraverse(BTree* pRoot)
{
	if (pRoot == NULL)
		return;
	BackOrderTraverse(pRoot->m_nLeft);
	BackOrderTraverse(pRoot->m_nRight);
	cout<<pRoot->m_nValue<<endl;
}
/*
分层遍历二叉树(按层次从上到下,从左往右)
相当于广度优先搜素,使用队列实现。
队列初始化,将跟节点压入队列。
当队列不为空:弹出一个节点,访问,若左子树节点或者右子树节点不为空,将其压入队列!
*/
void LevelTraverse(BTree* pRoot)
{
	if (pRoot == NULL)
		return;
	queue<BTree*> q;
	q.push(pRoot);
	while (!q.empty())
	{
		BTree* pNode = q.front();
		q.pop();
		cout<<pNode->m_nValue<<endl;//访问节点
		if(pNode->m_nLeft != NULL)
			q.push(pNode->m_nLeft);
		if (pNode->m_nRight != NULL)
			q.push(pNode->m_nRight);
	}
}
时间: 2024-10-15 23:16:53

C++算法之 求二叉树的节点个数、深度、四种遍历方法的相关文章

二叉树(7)----求二叉树叶子节点个数,递归和非递归

1.二叉树定义: typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct BTreeNode_t_ { BTreeNodeElement_t *m_pElemt; struct BTreeNode_t_ *m_pLeft; struct BTreeNode_t_ *m_pRight; } BTreeNode_t; 2.求二叉树叶子节点数 叶子节点:即没有左右子树的结点 (1)递归方

二叉树的四种遍历方法(递归、迭代)

一.前序遍历 前序遍历简单来讲,遍历顺序是:根节点-左子树-右子树 1.递归遍历 1 void preorder(BinTree *T) 2 { 3 if(T==NULL) 4 return; 5 cout << T->data; 6 preorder(T->left); 7 preorder(T->right); 8 } 2.迭代遍历(用栈实现) 1 void preorder2(BinTree *T) 2 { 3 //空树,直接返回 4 if(T==NULL) 5 ret

二叉树链式存储中的四种遍历方法

void InorderTraversal( BinTree BT ) { if( BT ) { InorderTraversal( BT->Left ); /* 此处假设对BT结点的访问就是打印数据 */ printf("%d ", BT->Data); /* 假设数据为整型 */ InorderTraversal( BT->Right ); } } void PreorderTraversal( BinTree BT ) { if( BT ) { printf(&

【数据结构】二叉树的实现(如:默认成员函数、(叶子)节点数、深度、四种遍历)

二叉树:树的每个节点最多有两个子节点. 我们看下它的结构,有二叉链表结构与三叉链表结构,具体结果如我摘自<C++Primer>中的图. 相比之下,三叉链表的优势在于当我们知道父亲节点要找他的子女节点比较方便和便捷,反之当我们知道子女节点找它的父亲节点时也方便. 下面,我实现下二叉链表的结构. template <class T> struct BinaryTreeNode {     BinaryTreeNode<T>* _left;    //左子树     Bina

求二叉树第K层的节点个数+求二叉树叶子节点的个数

size_t _FindLeafSize(Node* root)     //求二叉树叶子节点的个数    {        //static size_t count = 0;        if (root == NULL)            return 0; if (root->_left == NULL&&root->_right == NULL);        return 1; return _FindLeafSize(root->_right) +

11求二叉树中节点的最大距离

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4253605.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目:如果我们把二叉树看成一个图,一棵树显示是一颗有向无环图,定义"距离"为两节点之间边的个数(不考虑方向).写一个程序,求一棵二叉树中相距最远的两个节点

【编程题目】求二叉树中节点的最大距离

第 11 题(树)求二叉树中节点的最大距离...如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数.写一个程序,求一棵二叉树中相距最远的两个节点之间的距离. 思路:二叉树结构中只设了左右子节点的指针. 设单个结点的深度为0. 用后序遍历,得到每个结点为根的子树的最大深度.maxdistance记录该结点(左子树深度+右子树深度 + 2)是否超过已有的最远距离,若超过更新. 关键:空指针的深度设为-1,这样避免了复杂的分类讨论. 树每个结

编程之美之求二叉树中节点的最大距离

题目:如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数.写一个程序求一棵二叉树中相距最远的两个节点之间的距离. 分析:树上分析的很清楚,计算一个二叉树的最大距离有两个情况: 1. 路径经过左子树的最深节点,通过根节点,再到右子树的最深节点. 2. 路径不穿过根节点,而是左子树或右子树的最大距离路径,取其大者. 但是树上的代码使用了额外的节点字段,这里给出我的代码,思路是一样的: struct BinaryTree { int valu

11.求二叉树中节点的最大距离

如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义 " 距离 " 为两节点之间边的个数.写一个程序,求一棵二叉树中相距最远的两个节点之间的距离,求二叉树中节点的最大距离 分析: 先画几个不同形状的二叉树,从例子中可以看出,相距最远的两个节点,一定是两个叶子节点,或者是一个叶子节点到它的根节点: 根据相距最远的两个节点一定是叶子节点这个规律,我们可以进一步讨论. 对于任意一个节点,以该节点为根,假设这个根有 K 个孩子节点,那么相距最远的两 个节点 U和 V之间的路