【数据结构】二叉树的递归实现

二叉树的概念,这里就不想多说了,但是你需要知道满二叉树,完全二叉树等等这些基本

概念,下边进入正题。

首先创建一棵二叉树,下边看代码

Node* _Create(T* a,size_t size,size_t& index,const T& invalid)
	{
		assert(a);
		Node* root = NULL;
		while (index < size && a[index] != invalid)
		{
		    root = new Node(a[index]);
			root->_left = _Create(a,size,++index,invalid);
			root->_right = _Create(a,invalid);
		}
		return root;
	}


这里需要注意的就是对数组a的断言。养成好的习惯,该断言就断言。还有就是index这

个必须是引用,因为每个元素只访问一次,也就是外部改的index,内部也需要改。所以

,就是传引用。

二叉树的销毁:

void _Destroy(Node* root)
	{
		if (root == NULL)
			return;

		_Destroy(root->_left);
		_Destroy(root->_right);
	}


递归代码,看着很简单,但是别忘了销毁,否则内存泄漏。

二叉树的三种遍历----前序,中序,后序

void _PreOrder(Node* root)
	{
		Node* cur = root;
		if (cur != NULL)
		{
			cout << cur->_data<<" ";
			_PreOrder(cur->_left);
			_PreOrder(cur->_right);
		}
	}
	void _Inorder(Node* root)
	{
		Node* cur = root;
		if (cur != NULL)
		{
			_Inorder(cur->_left);
			cout << cur->_data<<" ";
			_Inorder(cur->_right);
		}
	}
	void _postorder(Node* root)
	{
		Node* cur = root;
		if (cur != NULL)
		{
			_postorder(cur->_left);
			_postorder(cur->_right);
			cout << cur->_data<<" ";
		}
	}


层序遍历:

void _TiertOrder(Node* root)
	{
		queue<Node*> q;
		Node* cur = root;
		q.push(cur);
		while (!q.empty())
		{
			Node* tmp = q.front();
			cout << tmp->_data << " ";
			if (tmp->_left)
			{
				q.push(tmp->_left);
			}
			if (tmp->_right)
			{
				q.push(tmp->_right);
			}
			q.pop();
		}
	}


这个过程用到了队列,这里就讲一下思路吧:如果不是空树,根节点入队,如果入队结

点的子树不为空,将子树也入队,入队之后弹出根节点,下边以此类推。比如跟的左孩

子存在,并且已经入队,如果左孩子有左右孩子,将左右孩子也入队,弹出开始入队的

左孩子。

二叉树的深度:

size_t _Depth(Node* root)
	{
		if (root == NULL)
			return 0;

		size_t left = _Depth(root->_left);
		size_t right = _Depth(root->_right);
		return left > right ? left + 1 : right + 1;
	}


递归过程比较耗时,所以上边的两个变量是很有必要的,永远不要为了代码看着简洁而

不考虑计算机的感受。

二叉树的结点个数:

size_t _Size(Node* root)
	{
		if (root == NULL)
			return 0;

		return _Size(root->_left) + _Size(root->_right) + 1;
	}


二叉树中元素的查找

Node* _Find(Node* root,const T& x)
	{
		Node* cur = root;
		if (cur == NULL)
			return NULL;

		if (cur->_data == x)
			return cur;

		//左子树没有找到才会去遍历 右子树
		if (!_Find(cur->_left,x))
			_Find(cur->_right,x);
	}


好了,关于二叉树的递归实现就到这里--

相关文章

【啊哈!算法】算法3:最常用的排序——快速排序       ...
匿名组 这里可能用到几个不同的分组构造。通过括号内围绕的正...
选择排序:从数组的起始位置处开始,把第一个元素与数组中其...
public struct Pqitem { public int priority; ...
在编写正则表达式的时候,经常会向要向正则表达式添加数量型...
来自:http://blog.csdn.net/morewindows/article/details/6...