• 树的深度优先遍历和广度优先遍历非递归实现.


    注:树的深度优先遍历就是二叉树的先序遍历.(我写的深度优先遍历可能有点奇怪,不是按照那种一次遍历到左子树的结点那种方式写的)

    下面是我用java实现的代码.

     1 package com.datastruct;
     2 
     3 import java.util.LinkedList;
     4 import java.util.Stack;
     5 
     6 public class TreeNode {
     7     int val = 0;
     8     TreeNode left = null;
     9     TreeNode right = null;
    10 
    11     public TreeNode(int val) {
    12         this.val = val;
    13 
    14     }
    15     
    16     
    17     /*
    18      *树的深度优先遍历 
    19      *按树的每一条分支遍历树
    20      *利用一个栈进行辅助
    21      */
    22     public void DeepFirstSearch_NoRecursion(TreeNode root)
    23     {
    24         Stack<TreeNode> treeStack = new Stack<>();
    25         
    26         if(root == null)
    27         {
    28             return;
    29         }
    30         
    31         treeStack.add(root);
    32         
    33         while(!treeStack.isEmpty())
    34         {
    35             TreeNode currentNode =  treeStack.pop();//栈顶元素出栈
    36             System.out.print(currentNode.val);//访问节点
    37             
    38             /*深搜需要先访问左子树的一条分支,故右孩子先入栈*/
    39             if(currentNode.right != null)
    40             {
    41                 treeStack.push(currentNode.right);
    42             }
    43             
    44             if(currentNode.left != null)
    45             {
    46                 treeStack.push(currentNode.left);
    47             }
    48         }
    49     }
    50     
    51     /*
    52      *广度优先遍历 
    53      *按照树的每一层进行遍历
    54      *利用一个队列进行辅助
    55      */
    56     public void BreadFirstSearch_NoRecursion(TreeNode root)
    57     {
    58         LinkedList<TreeNode> treeQueue = new LinkedList<>();//用链表来模拟队列
    59         
    60         if(root == null)
    61         {
    62             return;
    63         }
    64         
    65         treeQueue.add(root);
    66         
    67         while(!treeQueue.isEmpty())
    68         {
    69             TreeNode currenNode = treeQueue.getFirst(); //获取队首元素
    70             
    71             System.out.println(currenNode.val);//访问节点
    72             
    73             if(currenNode.left != null)
    74             {
    75                 treeQueue.add(currenNode.left);//左子树进队列
    76             }
    77             
    78             if(currenNode.right != null)
    79             {
    80                 treeQueue.add(currenNode.right);//右子树进队列
    81             }
    82             
    83             treeQueue.removeFirst();//队首元素访问完出队列
    84         }
    85     }
    86 }
  • 相关阅读:
    C/C++学习的50个经典网站
    C++ 调用C++写的函数库的2种方法之一(显式调用)
    C++ 调用C++写的类库的2种方法之一(隐式链接)
    几个第三方yum源
    网站运维管理工具
    网站架构文章收集
    linux setup 相关text mode图形配置工具的安装
    nfs 安装配置
    centos6.4 minimal 安装kvm
    keepalived
  • 原文地址:https://www.cnblogs.com/daimadebanyungong/p/5055097.html
Copyright © 2020-2023  润新知