二叉树常见题目-1

1.二叉树结构定义

节点类

//二叉树节点类
    class TreeNode{
        char value;
        TreeNode left;
        TreeNode right;

        public TreeNode(char value){
            //引用类型不需要初始化
            this.value=value;
        }
    }

1.二叉树前序遍历

二叉树的前序就是先遍历根节点,再遍历左子树最后才是右子树。遍历分为递归和非递归方式
递归方式

/**
    * @name: binaryTreePrevOrder
    * @description: 前序遍历
    * @param root
    * @return: void
    *
   */
   public void binaryTreePrevOrder(TreeNode root){
        //递归终止条件
        if(root==null)
            return;

        System.out.print(root.value+" ");
        binaryTreePrevOrder(root.left);
        binaryTreePrevOrder(root.right);

    }

非递归方式:非递归遍历就得用到栈进行节点的存储。

/**
     * @name: binaryTreePrevOrderNonR
     * @description: 二叉树前序遍历非递归
     * @param root
     * @return: void
     *
    */
    void binaryTreePrevOrderNonR(TreeNode root){
       if(root==null)
           return;
        Stack<TreeNode> stack=new Stack<TreeNode>();
        TreeNode cur=root;
        TreeNode top=root;

        //此时的cur已经走top.right需要重新判断,而加的!stack.empty()是为了在cur为null时重新获取栈顶元素
        while(cur!=null||!stack.empty()){
            //先遍历根的左子树
            while(cur!=null){
                stack.push(cur);
                System.out.print(cur.value+" ");
                cur=cur.left;
            }
            top=stack.pop();
            cur=top.right;
        }
    }

2.中序遍历

中序遍历是按照着:左子树、根节点、右子树的顺序进行遍历的。
递归方式

/**
     * @name: binaryTreeInOrder
     * @description: 中序遍历
     * @param root
     * @return: void
     *
     */
    public void binaryTreeInOrder(TreeNode root){
        //递归终止条件
        if(root==null)
            return;

        binaryTreeInOrder(root.left);
        System.out.print(root.value+" ");
        binaryTreeInOrder(root.right);
    }

非递归方式

/**
     * @name: binaryTreeInorderNonR
     * @description: 中序遍历非递归
     * @param root
     * @return: void
     *
    */
    void binaryTreeInorderNonR(TreeNode root){
       Stack<TreeNode> stack=new Stack<TreeNode>();
       TreeNode cur=root;
       TreeNode top=null;

       while(cur!=null || !stack.empty()) {

           while (cur != null) {
               stack.push(cur);
               cur=cur.left;
           }
           top = stack.pop();
           System.out.print(top.value+" ");
           cur = top.right;
       }
    }

3.后序遍历

后序遍历的顺序按照:左子树、右子树、根节点。
递归方式

/**
     * @name: binaryTreePostOrder
     * @description: 后序遍历
     * @param root
     * @return: void
     *
     */
    public void binaryTreePostOrder(TreeNode root){
        //递归终止条件
        if(root==null)
            return;

        binaryTreePostOrder(root.left);
        binaryTreePostOrder(root.right);
        System.out.print(root.value+" ");
    }

非递归方式:后序遍历的非递归方式的是最有难度的一个操作,在经过根节点是时候是否打印根节点的数据我们必须得判断右子树是否已经被打印过。

/**
     * @name: binaryTreePostOrderNonR
     * @description: 后序遍历非递归
     * @param root
     * @return: void
     *
    */
    void binaryTreePostOrderNonR(TreeNode root){
        Stack<TreeNode> stack=new Stack<TreeNode>();
        TreeNode cur=root;
        TreeNode prev=null;

        while(cur!=null || !stack.empty()) {
            while (cur != null) {
                stack.push(cur);
                cur = cur.left;
            }

            //此时根节点不能出栈
            cur=stack.peek();
            //cur.right==prev说明右子树已经被打印过,prev记录的是是否已经被打印过
            if(cur.right==null||cur.right==prev) {
                stack.pop();
                System.out.print(cur.value+" ");
                //右子树不为空,则应将右子树入栈
                prev=cur;
                //防止cur重复入栈
                cur=null;
            } else{
                cur=cur.right;
            }
        }
    }
(1)非递归定义 树(tree)是由n(n≥0)个结点组成的有限集合。n=0的树称为空树;n>0的树T: ① 有且仅有一个结点n0,它没有前驱结点,只有后继结点。n0称作树的根(root)结点。 ② 除结点外n0 , 其余的每一个结点都有且仅有一个直接前驱结点;有零个或多个直接后继结点。 (2)递归定义 一颗大树分成几个大的分枝,每个大分枝再分成几个小分枝,小分枝再分成更小的分枝,… ,每个分枝也都是一颗树,由此我们可以给出树的递归定义。 树(tree)是由n(n≥0)个结点组成的有限集合。n=0的树称为空树;n>0的树T: ① 有且仅有一个结点n0,它没有前驱结点,只有后继结点。n0称作树的根(root)结点。 ② 除根结点之外的其他结点分为m(m≥0)个互不相交的集合T0,T1,…,Tm-1,其中每个集合Ti(0≤i<m)本身又是一棵树,称为根的子树(subtree)。 2、掌握树的各种术语: (1) 父母、孩子与兄弟结点 (2) 度 (3) 结点层次、树的高度 (4) 边、路径 (5) 无序树、有序树 (6) 森林 3、二叉树的定义 二叉树(binary tree)是由n(n≥0)个结点组成的有限集合,此集合或者为空,或者由一个根结点加上两棵分别称为左、右子树的,互不相交的二叉树组成。 二叉树可以为空集,因此根可以有空的左子树或者右子树,亦或者左、右子树皆为空。 4、掌握二叉树的五个性质 5、二叉树的二叉链表存储。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值