• 使用递归和非递归算法实现二叉搜索树的遍历


    【使用递归和非递归实现二叉搜索树的遍历】


                      使用递归和非递归实现二叉搜索树的遍历

    1.遍历的基本概念所谓遍历(Traversal),是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问题。 遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。

    2.使用递归算法分别执行先序,中序,后序遍历:

     

     1 public class BinaryTree {
     2     // 初始化二叉树
     3     public Node init() {
     4         Node I = new Node(8, null, null);
     5         Node H = new Node(4, null, null);
     6         Node G = new Node(2, null, null);
     7         Node F = new Node(7, null, I);
     8         Node E = new Node(5, H, null);
     9         Node D = new Node(1, null, G);
    10         Node C = new Node(9, F, null);
    11         Node B = new Node(3, D, E);
    12         Node A = new Node(6, B, C);
    13         // 返回根节点
    14         return A;
    15     }
    16 
    17     // 访问节点
    18     public void printNode(Node node) {
    19         System.out.println(node.getData());
    20     }
    21 
    22     // 先序遍历
    23     public void theFirstTraversal(Node root) {
    24         printNode(root);
    25         // 使用递归遍历左孩子
    26         if (root.getLeftNode() != null) {
    27             theFirstTraversal(root.getLeftNode());
    28         }
    29         // 使用递归遍历右孩子
    30         if (root.getRightNode() != null) {
    31             theFirstTraversal(root.getRightNode());
    32         }
    33     }
    34 
    35     // 中序遍历
    36     public void theInOrderTraversal(Node root) {
    37         // 递归遍历左孩子
    38         if (root.getLeftNode() != null) {
    39             theInOrderTraversal(root.getLeftNode());
    40         }
    41         printNode(root);
    42         // 遍历右孩子
    43         if (root.getRightNode() != null) {
    44             theInOrderTraversal(root.getRightNode());
    45         }
    46     }
    47 
    48     // 后序遍历
    49     public void thePostOrderTraveral(Node root) {
    50         // 递归遍历左孩子
    51         if (root.getLeftNode() != null) {
    52             theInOrderTraversal(root.getLeftNode());
    53         }
    54 
    55         // 遍历右孩子
    56         if (root.getRightNode() != null) {
    57             theInOrderTraversal(root.getRightNode());
    58         }
    59         printNode(root);
    60 
    61     }
    62 
    63     public static void main(String[] args) {
    64         BinaryTree t = new BinaryTree();
    65         Node node = t.init();
    66         System.out.println("先序遍历:");
    67         t.theFirstTraversal(node);
    68         System.out.println("中序遍历:");
    69         t.theInOrderTraversal(node);
    70         System.out.println("后序遍历:");
    71         t.thePostOrderTraveral(node);
    72 
    73     }
    74 
    75 }

    2.使用非递归算法分别执行先序,中序,后序遍历:

     1 public class BinaryTree1 {
     2     // 初始化二叉树
     3     public Node init() {
     4         Node I = new Node(8, null, null);
     5         Node H = new Node(4, null, null);
     6         Node G = new Node(2, null, null);
     7         Node F = new Node(7, null, I);
     8         Node E = new Node(5, H, null);
     9         Node D = new Node(1, null, G);
    10         Node C = new Node(9, F, null);
    11         Node B = new Node(3, D, E);
    12         Node A = new Node(6, B, C);
    13         // 返回根节点
    14         return A;
    15     }
    16 
    17     public void printNode(Node node) {
    18         System.out.print(node.getData());
    19     }
    20 
    21     public void theFirstTraversal_Stack(Node root) { // 先序遍历
    22     Stack<Node> stack = new Stack<Node>();
    23         Node node = root;
    24         while (node != null || stack.size() > 0) { // 将所有左孩子压栈
    25             if (node != null) { // 压栈之前先访问
    26                 printNode(node);
    27             
    28                 stack.push(node);
    29                 
    30                 node = node.getLeftNode();
    31                 
    32             } else {
    33                 node = stack.pop();
    34                 
    35                 node = node.getRightNode();
    36                 
    37             }
    38         }
    39     }
    40 
    41     public void theInOrderTraversal_Stack(Node root) { // 中序遍历
    42         Stack<Node> stack = new Stack<Node>();
    43         Node node = root;
    44         while (node != null || stack.size() > 0) {
    45             if (node != null) {
    46                 stack.push(node); // 直接压栈
    47                 node = node.getLeftNode();
    48             } else {
    49                 node = stack.pop(); // 出栈并访问
    50                 printNode(node);
    51                 node = node.getRightNode();
    52             }
    53         }
    54     }
    55 
    56     public void thePostOrderTraversal_Stack(Node root) { // 后序遍历
    57         Stack<Node> stack = new Stack<Node>();
    58         Stack<Node> output = new Stack<Node>();// 构造一个中间栈来存储逆后序遍历的结果
    59         Node node = root;
    60         while (node != null || stack.size() > 0) {
    61             if (node != null) {
    62                 output.push(node);
    63                 
    64                 stack.push(node);
    65                 
    66                 node = node.getRightNode();
    67                 
    68             } else {
    69                 node = stack.pop();
    70                 node = node.getLeftNode();
    71             }
    72         }
    73         System.out.println(output.size());
    74         while (output.size() > 0) {
    75 
    76             printNode(output.pop());
    77         }
    78     }
    79 
    80     public static void main(String[] args) {
    81         BinaryTree1 tree = new BinaryTree1();
    82         Node root = tree.init();
    83         System.out.println("先序遍历");
    84         tree.theFirstTraversal_Stack(root);
    85         System.out.println("");
    86         System.out.println("中序遍历");
    87         tree.theInOrderTraversal_Stack(root);
    88         System.out.println("");
    89         System.out.println("后序遍历");
    90         tree.thePostOrderTraversal_Stack(root);
    91 
    92     }
    93 }

     

     

     

  • 相关阅读:
    scons配置文件
    与冯大辉谈数据库架构(InfoQ)
    7 Habits of Highly Effective Program Managers
    开心农场的架构
    二级下拉菜单被遮住,css设置zindex在ie下没作用的问题解决办法
    可伸缩性最佳实践(翻译)
    AJAX延迟异步加载边栏+服务器端缓存AJAX输出
    SQLServer索引调优实践
    SQLServer索引调优实践(2) 索引覆盖
    简单JS实现走马灯效果的文字(无需jQuery)
  • 原文地址:https://www.cnblogs.com/grl214/p/6695054.html
Copyright © 2020-2023  润新知