二叉树的遍历算法

递归算法`

void pre(root){
  if(root==null)return;
  else{
       print(root.val);//中序遍历和后序遍历只需要改变此行代码的顺序即可
       pre(root.left);
       pre(root.right);
   }
}

先序遍历非递归算法

void pre2(root){
    Stack s;
    TreeNode node=root;
    while(node!=null||!s.isEmpty()){
         while(node!=null)
         {
            print(node.val);//重点还是变换此行代码顺序
            s.push(node);
            node=node.left;
         }
         if(!s.isEmpty())
         { 
              node =s.pop();
              node=node.right;
         } 
   }
}

中序遍历非递归

void pre2(root){
    Stack s;
    TreeNode node=root;
    while(node!=null||!s.isEmpty()){
         while(node!=null)
         {
            s.push(node);
            node=node.left;
         }
         if(!s.isEmpty())
         { 
              node =s.pop();
              print(node.val);
              node=node.right;
         } 
}
}

中序遍历的编程题

后序遍历非递归

//借助两个栈来实现
 void post(
       if(root==null)return;
      Stack s1,s2;
      TreeNode node=root;      
      while(node!=null||!s1.isEmpty())
      {
              while(node!=null){
                    s1.push(node);//s1.为临时存储节点的栈,s2为存储所有节点的栈
                    s2.push(node);//存入根节点
                    node=node.right;//栈的先进后出特性,所以以根,右,左的顺序入栈。一直往右遍历。
              }
              if(!s1.isEmpty()){
                      node=s1.pop();
                      node=node.left;
             }
      }
      while(!s2.isEmpty()){
              node= s2.pop;//出栈顺序则为左右根
              print(node.val);
      }
)

层次遍历

//使用队列来实现
void level(root){
       if(root==null)return;
       Queue q;
       TreeNode node = root
       q.offer(root);
       while(!q.isEmpty()){
            node =q.poll();
            print(node.val);
            if(node.left!=null)q.offer(node.left);
            if(node.right!=null)q.offer(node.right);             
        }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值