二叉树(创建、遍历、树的最大深度和最小深度)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Gouhailiang/article/details/53087948

树的引出最初是由二分查找的原理引出来的,一般顺序查找算法的复杂度为O(N),而一般二分查找的复杂度为logN
一个二分查找算法可以用一颗查找树来表示,树的根结点为顺序数组的中点,这样依次查找效率等同于二分查找算法
一般的树用数组表示或链表表示都会造成空间的浪费,而由于一般的树可以通过兄弟儿子表示法将一般树转换为二叉树
因此对树的研究主要针对是针对二叉树的研究
二叉树可以分为一般二叉树,完全二叉树和完美二叉树
1 二叉树的存储:
数组:
这需要将二叉树填充为完全二叉树,并按编号存储在数组中,并根据编号左孩子=父节点*2,右孩子=父节点*2+1,父节点=[子节点/2]的确定层次关系
而这对于非完全二叉树会造成一定的资源浪费
链表:
一个节点包含一个数据和一个左指针和右指针,依然会有一些浪费

2 二叉树的遍历:先序/中序/后序----遍历的核心问题为:二维结构的线性化
递归:
方法较简单,其实递归的实现是依靠栈
如中序遍历:
(1)中序遍历其左子树
(2)访问根节点
(3)中序遍历其右子树

结论:以上三种遍历方法都有一个连通的遍历路径,三种遍历过程经过的路线一样,只是访问节点的时机不同,由此引出堆栈实现遍历的方法:
堆栈:
如中序遍历的堆栈实现方法:
--遇到一个节点,就把它压栈,并去遍历它的左子树;
--当左子树遍历结束后,从栈顶弹出一个结点,并访问它
--然后按照这个节点的右指针再去中序遍历该节点的右子树。
其他遍历方法类似
具体代码参考网上

接下来我们利用链表来实现一个二叉树,其实一般的二叉树用处并不大,后面会引申出二叉搜索树,红黑树,堆等。。再此我们只需要掌握如何对二叉树进行遍历,首先我们用前序遍历的方法创建一个二叉树,然后研究其遍历方法(递归),只给出了中序遍历,其他遍历方法类似,交换一下顺序即可。

另外,还需要了解一些其他对树的操作,再此举一个《剑指offer》上的一个笔试题,即给出一个树,求出树的最大深度和最小深度。

#include <iostream>
using namespace std;
typedef char elemtype;
typedef struct TreeNode{
	elemtype val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(elemtype x) : val(x),left(NULL),right(NULL){}
}Node, *Tree;
Tree creatTree()
{
	elemtype x;
	Node *node;
	cin >> x;
	if(x == -1) 
		node = NULL;
	else
	{
		node = new Node(x);
		node->left = creatTree();
		node->right = creatTree();
	}
	return node;
}
int maxDepth(Tree T)
{
	int DL, DR, Dmax;
	if(T)
	{
		DL = maxDepth(T->left);
		DR = maxDepth(T->right);
		Dmax = (DL<DR)?DR : DL;
		return (Dmax+1);
	}
	else
		return 0;
}

int minDepth(Tree T)
{
	int DL, DR, Dmin;
	if(T)
	{
		if(T->left == NULL) return minDepth(T->right) + 1;
      if(T->right == NULL) return minDepth(T->left) + 1;
		DL = minDepth(T->left);
		DR = minDepth(T->right);
		Dmin = (DL>DR)?DR : DL;
		return (Dmin+1);
	}
	else
		return 0;
	
}
void inorderTraverse(Tree T)
{
	if(T)
	{
		cout << T->val << " ";
		inorderTraverse(T->left);
		inorderTraverse(T->right);
	}
}
int main()
{
	Tree tree;
	tree = creatTree();
	inorderTraverse(tree);
	cout << endl;
	cout << "minDepth:" << minDepth(tree) << endl;
	cout << "maxDepth:" << maxDepth(tree) << endl;
	return 0;
}



展开阅读全文

没有更多推荐了,返回首页