二叉树的递归与迭代实现(java)

举报
秋名山码民 发表于 2022/08/31 15:41:09 2022/08/31
【摘要】 递归实现,前序:根左右中序:左根右后续:左右根首先我们需要了解什么是二叉树的前序遍历:按照访问根节点——左子树——右子树的方式遍历这棵树,而在访问左子树或者右子树的时候,我们按照同样的方式遍历,直到遍历完整棵树。因此整个遍历过程天然具有递归的性质,我们可以直接用递归函数来模拟这一过程。中序和后序同理:package 二叉树;public class 递归 { public class ...

递归实现,

前序:根左右

中序:左根右

后续:左右根

首先我们需要了解什么是二叉树的前序遍历:按照访问根节点——左子树——右子树的方式遍历这棵树,而在访问左子树或者右子树的时候,我们按照同样的方式遍历,直到遍历完整棵树。因此整个遍历过程天然具有递归的性质,我们可以直接用递归函数来模拟这一过程。

中序和后序同理:

package 二叉树;

public class 递归 {
    public class Node{
        public int value;
        public Node Left;
        public Node Right;

        public Node(int data){
            this.value = data;
        }
    }
    public void preOrderRecur(Node head){
        if(head == null){
            return;
        }
        System.out.println(head.value+" ");
        preOrderRecur(head.Left);
        preOrderRecur(head.Right);
    }
    public void inOrederRecur(Node head){
        if(head == null){
            return;
        }
        inOrederRecur(head.Left);
        System.out.println(head.value+" ");

        inOrederRecur(head.Right);
    }
    public void posOrederRecur(Node head){
        if(head == null){
            return;
        }
        posOrederRecur(head.Left);
        posOrederRecur(head.Right);
        System.out.println(head.value+" ");
    }
    
}

迭代实现,

用自己的数据结构来代替函数栈的递归,凡是可以用递归的都能用迭代写出来

package 二叉树;

import java.util.Stack;

public class 非递归 {
    public class Node{
        public int value;
        public Node Left;
        public Node Right;

        public Node(int data){
            this.value = data;
        }
    }
    //用自己的数据结构来模拟代替函数栈
    public void preOrderUnRecur(Node head){
        System.out.println("pre-order: ");
        if(head != null){
            Stack< Node> stack = new Stack<Node>();
            stack.add(head);//插入根
            while(!stack.empty()){
                head = stack.pop();//弹出根
                System.out.println(head.value+" ");
                if(head.Right != null){
                    stack.push(head.Right);//栈的先进后出,最后左边会先打印
                }
                if(head.Left != null){
                    stack.push(head.Left);
                }
            }
        }
        System.out.println();
    }

    //中 zuo,根,you
    public void inOrderUnRecur(Node head){
        System.out.println("in-order: ");
        if(head != null){
            Stack<Node> stack = new Stack<Node>();
            while(!stack.empty() || head != null){
                if(head!=null){
                    stack.push(head);
                    head = head.Left; //一直放左,直到碰到根      左根右
                }else{
                    head = stack.pop();
                    System.out.println(head.value+" ");
                    head = head.Right;
                }
            }
        }
        System.out.println();
    }

    //后 zuo,you,根
    public void posOrderUnRecur(Node head){
        System.out.println("pos-order: ");
        if(head != null){
            Stack<Node> s1 = new Stack<Node>();//俩个栈实现
            Stack<Node> s2 = new Stack<Node>();
            s1.push(head);
            while(!s1.isEmpty()){
                head = s1.pop();
                s2.push(head);
                if(head.Left != null){
                    s1.push(head.Left);
                }
                if(head.Right != null){
                    s1.push(head.Right);
                }
            }
            while(!s2.isEmpty()){
                System.out.println(s2.pop()+" ");
            }
        }
    }

}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。