用递归来实现二叉树的算法代码非常简单,但同时也带来效率太低的弊端。为了提高效率我们会选择用非递归的方式来实现二叉树的算法。由于栈就是一种递归的思想,所以在实现非递归的算法时我们要借助栈来实现,主要的原理就是用栈来模拟递归的过程。下面在实现非递归算法的同时,也会将递归的算法给出做一个对比。
一、创建一颗二叉树(先序创建)
以{1,2,3,'#','#',4,'#','#',5,6}为例:
先创建左路,每创建一个结点就入栈,cur指向当前结点:
左路创建完毕之后用一个变量top保存栈顶元素3,然后将栈顶的元素3抛出:
然后再创建top的右子树且cur=top->_right,然后再重复上述操作,直到创建完毕。
非递归:
TreeNonR(const T* a, size_t size, const T& invalid)
{
Node* cur = NULL;
stack<Node*> s;
size_t index = 0;
while (index < size)
{
while (index < size&&a[index] != invalid)
{
if (index == 0) //根节点特殊处理
{
_root = new Node(a[index++]);
cur = _root;
}
else
{
cur->_left = new Node(a[index++]);
cur = cur->_left;
}
s.push(cur);
}
index++;
Node* top = s.top();
s.pop();
if (index < size&&a[index] != invalid) //如果右子树的根节点不为空再创建
{
cur = top;
cur->_right = new Node(a[index++]);
cur = cur->_right;
s.push(cur);
}
}
}
递归:
BinaryTree(const T *array,size_t size,const T& invalid)
{
size_t index = 0;
_root=_CreatTree(array,size,index,invalid);
}
Node* _CreatTree(const T *array, size_t size, size_t& index, const T& invalid)
{
assert(array);
Node *root=NULL;
if (index < size&&array[index] != invalid)
{
root = new Node(array[index]); //创建根节点
root->_left = _CreatTree(array,size,++index,invalid); //递归创建左子树
root->_right= _CreatTree(array,size,++index,invalid); //递归创建右子树
}
return root;
}
二、先序遍历
如上图:用一个cur遍历左路,并且将遍历的每一个结点入栈,当左路为空的时候将栈顶元素出栈并保存,并且让cur指向这个出栈元素的右子树重复上述操作,直到栈&&cur同时为空,遍历结束。
非递归:
void PrevOderNonR()
{
N

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



