数据结构——二叉树基础

概念

空树:没有结点的树称为空树(null或empty)。

二叉树:每个节点最多有两个子树。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。

二叉树特点

1)每个结点最多有两颗子树,所以二叉树中不存在度大于2的结点。

2)左子树和右子树是有顺序的,次序不能任意颠倒。

3)即使树中某结点只有一棵子树,也要区分它是左子树还是右子树。

完全二叉树:若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树。

image

满二叉树:除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树。

image

平衡二叉树:父节点的左子树和右子树的高度之差不能大于1,也就是说不能高过1层,否则该树就失衡了

二叉树的存储结构

1、顺序存储

2、链表

二叉树遍历

前序遍历:首先访问根结点然后遍历左子树,最后遍历右子树。
通俗的说就是从二叉树的根结点出发,当第一次到达结点时就输出结点数据,按照先向左在向右的方向访问。
如图:二叉树的前序遍历输出为:ABDHIEJCFG

迭代算法实现:

public List preorderTraversal(TreeNode root){
       List list=new ArrayList();
       Stack stack=new Stack();//站内存右子树节点,用栈的先进后出来模拟右子树的根节点的存取顺序
       TreeNode r=root;//创建一个指针,表示当前节点,从根节点开始
       while(r!=null||!stack.isEmpty()){//短路或先判断当前节点是否为空,此前r=r.left 不为空证明左子树没有走到最后一个,
                                   //当前节点为空,左子树遍历完判断栈内是否为空,不为空证明还存在未遍历的右子树,不为空时弹栈遍历右子树
           if(r==null){
               r=stack.pop();
           }
           if(r.right!=null){
               stack.push(r.right);
           }
           list.add(r.val);
           r=r.left;
           
       }
       
       return list;
   }
           if(r.right!=null){
               stack.push(r.right); //如果存在右子树 则将其根节点压栈
           }
           list.add(r.val); //将当前遍历到的结点加入到list结合
           r=r.left;   //将左子树的根节点变成当前的根节点
       }
       return list;
   }

递归实现:

中序遍历:首先遍历左子树,然后访问根结点,最后遍历右子树。
【从根结点出发,则第一次到达结点A,不输出A,继续向左访问,第一次访问结点B,不输出B;继续到达D,H;到达H,H左子树为空,则返回到H,此时第二次访问H,故输出H;H右子树为空,则返回至D,此时第二次到达D,故输出D;由D返回B,第二次到达B,故输出B;】
按照同样规则继续访问,输出J、E、A、F、C、G;

则3.13所示二叉树的中序遍历输出为:HDIBJEAFCG


迭代算法:

public List inorderTraversal(TreeNode root) {
        List list=new ArrayList();
        Stack stack=new Stack();
        TreeNode r=root;
        while(r!=null||!stack.isEmpty()){
            while(r!=null){
                stack.push(r);
                r=r.left;
            }
            r=stack.pop();
            list.add(r.val);
            r=r.right;
        }
        return list;
   }

递归:

后序遍历:首先遍历左子树,然后遍历右子树,最后遍历访问根结点
二叉树的后序遍历输出为:HIDJEBFGCA

递归:

层次遍历:按照树的层次自上而下的遍历二叉树。
二叉树的层次遍历结果为:ABCDEFGHIJ

迭代算法:

public static List> levelOrder(TreeNode root){
       if(root == null)
           return new ArrayList<>();//注意上来考虑空的问题
       List> list = new ArrayList>();
       Queue queue = new LinkedList();
       queue.add(root);
       while(!queue.isEmpty()){
           int count=queue.size();
           List l = new ArrayList();
           while(count>0){
               root=queue.poll();
               l.add(root.val);
               if(root.left!=null){
                   queue.add(root.left);
               }
               if(root.right!=null){
                   queue.add(root.right);
               }
               count--;
           }
           list.add(l);
       }
       
       return list;
   }

递归:

给定两个二叉树,编写一个函数来检验它们是否相同:

public  boolean isSameTree(TreeNode p, TreeNode q) {
       boolean flag=true;
       List plist = inorderTraversal(p);
       List qlist = inorderTraversal(q);
       if(plist.size()!=qlist.size())
           return false;
       Iterator pi =plist.iterator();
       Iterator qi = qlist.iterator();
       while(pi.hasNext()&&qi.hasNext()){
           if(pi.next()!=qi.next()){
               flag=false;
           }
       }
       return flag;
       
   }

递归:

你可能感兴趣的:(数据结构——二叉树基础)