二叉树的遍历(前序遍历,中序遍历,后序遍历)

本文详细介绍了二叉树的前序、中序和后序遍历,并提供了C++和Java两种语言的实现代码。通过具体的节点类和二叉树类,展示了如何构建二叉树并进行遍历操作。最后,通过一个包含五个节点的二叉树实例,演示了三种遍历方法的输出结果,帮助读者深入理解二叉树遍历的原理。
摘要由CSDN通过智能技术生成

一、二叉树的遍历方式

        1、前序遍历

        2、中序遍历

        3、后序遍历

遍历思想:遍历二叉树采用递归的方式,首先要理解递归的思想。

遍历是要先判断根节点是否为空,如果不为空时,再向下遍历。

二叉树的遍历: 按某条搜索路径访问树中某个节点,树的每个节点均被访问依次,且只访问一次

先序遍历:先访问根,再访问左子树,再访问右子树 (根左右)
中序遍历:先访问左子树,在访问根,再访问右子树(左根右)
后序遍历:先访问左子树,再访问右子树,再访问根 (左右根)

下面先用C++把遍历思路展示:

1、二叉树的存储结构

typedef struct BiTNode {
		ElemType data;
		struct BiTNode *lchild,*rchild;
	}BiTNode,BiTree;

2、三种遍历如下


先序遍历的 递归算法:		//时间复杂度O(n)
	void PreOrder(BiTree T) {
		if(T!=NULL){
		Visit(T);
		PreOrder(T->lchild);
		PreOrder(T->rchild);
		}
		}

中序遍历的递归算法:	//时间复杂度O(n)
	void InOrder(BiTree T){
		if(T!=NULL){
		InOrder(T->lchild);
		Visit(T);
		InOrder(T->rchild);
		}
	}

后序遍历的递归算法:
	void PostOrder(BiTree T){	//时间复杂度O(n)
		if(T!=NULL) {
		PostOrder(T->lchild);
		PostOrder(T->rchild);
		Visit(T);
		}
	}

通过以上可以把遍历思想了解清楚

下面采用具体事例进行遍历:采用java  设置 5 个带编号的人物说明:

第一步:建立节点类


//创建节点
class HeroNode{
    private int no;
    private String name;
    private HeroNode left;
    private HeroNode right;

    public HeroNode(int no, String name) {
        this.no = no;
        this.name = name;
    }

    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public HeroNode getLeft() {
        return left;
    }

    public void setLeft(HeroNode left) {
        this.left = left;
    }

    public HeroNode getRight() {
        return right;
    }

    public void setRight(HeroNode right) {
        this.right = right;
    }

    @Override
    public String toString() {
        return "HeroNode{" +
                "no=" + no +
                ", name='" + name + '\'' +
                '}';
    }

    //前序遍历
    public void preOrder()
    {
        System.out.println(this);
        if(this.left!=null)
            this.left.preOrder();
        if(this.right!=null)
            this.right.preOrder();
    }
    //中序遍历
    public void inOrder()
    {
        if(this.left!=null)
            this.left.inOrder();
        System.out.println(this);
        if(this.right!=null)
            this.right.inOrder();
    }
    //后续遍历
    public void postOrder()
    {
        if(this.left!=null)
            this.left.postOrder();
        if(this.right!=null)
            this.right.postOrder();
        System.out.println(this);
    }
}

第二步:创建二叉树类,调用遍历方法

//创建二叉树
class BinaryTree
{
    public HeroNode root;

   public void setRoot(HeroNode root)//建立根节点
   {
       this.root=root;
   }
//前序遍历
    public void perOrder()
    {
        if(this.root!=null)
        {
            this.root.preOrder();
        }else
            System.out.println("根节点空");
    }
    //中序遍历
    public void inOrder()
    {
        if(this.root!=null)
        {
            this.root.inOrder();
        }else
            System.out.println("根节点为空");
    }
    //后序遍历
    public void postOrder()
    {
        if(this.root!=null)
        {
            this.root.postOrder();
        }else
            System.out.println("根节点为空");
    }

}

第三步:创建二叉树对象,创建节点内容,连接各个节点,输出

class BinaryTree01 {
    public static void main(String[] args) {
        //创建二叉树
        BinaryTree B=new BinaryTree();

        //创建四个节点
        HeroNode n1=new HeroNode(1,"宋江");
        HeroNode n2=new HeroNode(2,"吴用");
        HeroNode n3=new HeroNode(3,"卢俊义");
        HeroNode n4=new HeroNode(4,"林冲");

        HeroNode n5=new HeroNode(5,"关胜");

        B.setRoot(n1);//设置根节点
        //连接节点
       n1.setLeft(n2);
       n1.setRight(n3);
       n3.setRight(n4);
       n3.setLeft(n5);


       B.perOrder();//前序遍历  1  2  3  4
        System.out.println("---------");
        B.inOrder();//中序遍历  2  1  3  4
        System.out.println("---------");
        B.postOrder();//后序遍历  2  4  3  1
    }
}

第四步:编译,执行

结果:

编译结果与预期的结果一致。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

朝闻道 ||

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

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

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

打赏作者

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

抵扣说明:

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

余额充值