非递归二叉树的算法

  用递归来实现二叉树的算法代码非常简单,但同时也带来效率太低的弊端。为了提高效率我们会选择用非递归的方式来实现二叉树的算法。由于栈就是一种递归的思想,所以在实现非递归的算法时我们要借助栈来实现,主要的原理就是用栈来模拟递归的过程。下面在实现非递归算法的同时,也会将递归的算法给出做一个对比。

一、创建一颗二叉树(先序创建)
   以{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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值