数据结构实验-二叉树的基本操作

实验内容:输出二叉树的中序遍历,前序遍历,后序遍历。

遍历过程

前序遍历

递归:若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。

归:可以使用一个栈来模拟这种操作。(利用回溯思想)

若二叉树为空,则空操作返回

当根节点(root)与栈(stack)同时不为空,判断 root 是否为空,

不为空:输出 root.val,将 root 压栈,并将 root 指向 root.left

为空:让 root 指向 stack.pop() ,并将 root 指向 root.right

中序遍历

递归:若二叉树为空,则空操作返回,否则从根结点开始(注意并不是先访问根结点),中序遍历根结点左子树,然后访问根结点,最后中序遍历右子树。

非递归:可以使用一个栈来模拟这种操作。(利用回溯思想)

若二叉树为空,则空操作返回,

当根节点(root)与栈(stack)同时不为空,判断 root 是否为空,

不为空:将root压栈,并将 root 指向其左孩子节点 root.left

为空:输出栈顶节点值(stack.peek().val),让 root 指向 stack.pop(),并将 root 重新指向 root.right

后序遍历

递归:若二叉树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历访问左右子树,最后是访问根结点。

非递归:可以使用一个栈(stack)和上一个访问节点来模拟这种操作。(利用回溯思想)

若二叉树为空,则空操作返回,

当根节点(root)与 stack 同时不为空,判断 root 是否为空,

不为空:将 root 压栈,并将 root 指向 root.left

为空:让 root 指向 stack.peek().right(栈顶节点的右节点)。

遍历方式的比较

程序代码

import java.util.Stack;
class Bianli {
    public void preOrder(TwoTree root) {
        if(root!=null)
        {
            System.out.print(root.getData()+" ");
            preOrder(root.getLeftNode());
            preOrder(root.getRightNode());
        }
    }
    public void preOrderNoDigui(TwoTree root) {
        Stack<TwoTree> stack=new Stack<>();
        while (true) {
            while (root!=null) {
                System.out.print(root.getData()+" ");
                stack.push(root);
                root=root.getLeftNode();
            }
            if(stack.isEmpty())
                break;
            root=stack.pop();
            root=root.getRightNode();
        }
    }
    public void inOrder(TwoTree root) {
        if(root!=null) {
            inOrder(root.getLeftNode());
            System.out.print(root.getData()+" ");
            inOrder(root.getRightNode());
        }
    }
    public void inOrderNoDigui(TwoTree root) {
        Stack<TwoTree> stack=new Stack<>();
        while (true) {
            while (root!=null) {
                stack.push(root);
                root=root.getLeftNode();
            }
            if(stack.isEmpty())
                break;
            root=stack.pop();
            System.out.print(root.getData()+" ");
            root=root.getRightNode();
        }
    }
    public void deOrder(TwoTree root) {
        if (root!=null) {
            deOrder(root.getLeftNode());
            deOrder(root.getRightNode());
            System.out.print(root.getData()+" ");
        }
    }
    public void deOrderNoDigui(TwoTree root) {
        Stack<TwoTree> stack=new Stack<>();
        while (true) {
            if(root!=null) {
                stack.push(root);
                root=root.getLeftNode();
            }else {
                if(stack.isEmpty())
                    return;
                if(stack.lastElement().getRightNode()==null) {
                    root=stack.pop();
                    System.out.print(root.getData()+" ");
                    while (root==stack.lastElement().getRightNode()) {
                        System.out.print(stack.lastElement().getData()+" ");
                        root=stack.pop();
                        if(stack.isEmpty())
                            break;
                    }
                }
                if(!stack.isEmpty())
                    root=stack.lastElement().getRightNode();
                else {
                    root=null;
                }
            }

        }
    }
    public static void main(String[] args) {
        TwoTree node10=new TwoTree(10,null,null);
        TwoTree node8=new TwoTree(8,null,null);
        TwoTree node9=new TwoTree(9,null,node10);
        TwoTree node4=new TwoTree(4,null,null);
        TwoTree node5=new TwoTree(5,node8,node9);
        TwoTree node6=new TwoTree(6,null,null);
        TwoTree node7=new TwoTree(7,null,null);
        TwoTree node2=new TwoTree(2,node4,node5);
        TwoTree node3=new TwoTree(3,node6,node7);
        TwoTree node1=new TwoTree(1,node2,node3);
        Bianli tree=new Bianli();
        System.out.println("------前序遍历-------");
        tree.preOrder(node1);
        System.out.println();
        tree.preOrderNoDigui(node1);
        System.out.println();
        System.out.println("------中序遍历-------");
        tree.inOrder(node1);
        System.out.println();
        tree.inOrderNoDigui(node1);
        System.out.println();
        System.out.println("------后序遍历-------");
        tree.deOrder(node1);
        System.out.println();
        tree.deOrderNoDigui(node1);
        System.out.println();

    }
}
public class TwoTree{
    private int data;
    private TwoTree LeftNode;
    private TwoTree RightNode;
    public TwoTree(int data,TwoTree left,TwoTree right) {
        this.data=data;
        this.LeftNode=left;
        this.RightNode=right;
    }
    public int getData() {
        return data;
    }
    public void setData(int data) {
        this.data = data;
    }
    public TwoTree getLeftNode() {
        return LeftNode;
    }
    public void setLeftNode(TwoTree leftNode) {
        LeftNode = leftNode;
    }
    public TwoTree getRightNode() {
        return RightNode;
    }
    public void setRightNode(TwoTree rightNode) {
        RightNode = rightNode;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

X-MTing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值