二叉树的遍历与删除(递归实现)

1.引言

这一段时间都没看java数据结构,松懈了。今天记录下二叉树的遍历,建树,删除节点。下一章 会用非递归的方式实现一下。

2.正题

新建一个TreeNode类:

public class TreeNode {

    private String tag;
    private int number;
    private TreeNode leftNode;
    private TreeNode rightNode;
    //自己实现get、set
}

2.1 建立二叉树

递归参数:等待插入的节点A,父节点B(假如插入成功)
核心思想:假如A.number<B.number。表示在B的左边。然后在判断B.leftNode 是否为null;为null,就将A插进入,不为null,就进行递归。同理A.number>B.number一样。

实现代码:


   public TreeNode rootNode;
   public void buildTree(TreeNode treeNode,TreeNode binaryTree){
       if (rootNode==null){
          rootNode=treeNode;
          rootNode.setLeftNode(null);
          rootNode.setRightNode(null);
          return;
       }
       if (treeNode.getNumber()<binaryTree.getNumber()){
           if (binaryTree.getLeftNode()!=null){
               buildTree(treeNode,binaryTree.getLeftNode());
           }else {
               binaryTree.setLeftNode(treeNode);
           }
       }else {
           if (binaryTree.getRightNode()!=null){
               buildTree(treeNode,binaryTree.getRightNode());
           }else {
               binaryTree.setRightNode(treeNode);
           }
       }
   }

main函数:

BinaryTree binaryTree=new BinaryTree();
       List<TreeNode>treeNodes=new ArrayList<>();
       treeNodes.add(new TreeNode("A",6));
       treeNodes.add(new TreeNode("B",3));
       treeNodes.add(new TreeNode("C",7));
       treeNodes.add(new TreeNode("D",1));
       treeNodes.add(new TreeNode("E",4));
       treeNodes.add(new TreeNode("F",9));
       treeNodes.forEach(treeNode -> {binaryTree.buildTree(treeNode,binaryTree.rootNode);});

2.2前序遍历

递归参数:TreeNode
核心思想:先输出当前节点的tag,然后判断是否存在左节点。存在的话递归。然后在判断右节点是否存在,存在递归。

 /**
     *          A
     *      B         C
     *   D      E         F
     *
     * 前序遍历 ABDECF
     */
    public void preorderTraversal(TreeNode treeNode){
        if (treeNode==null)
            return;
        System.out.print(treeNode.getTag());
        if (treeNode.getLeftNode()!=null)
             preorderTraversal(treeNode.getLeftNode());
        if (treeNode.getRightNode()!=null)
            preorderTraversal(treeNode.getRightNode());

    }

2.3中序遍历

递归参数:TreeNode
核心思想:先判断是否存在左节点。存在的话递归。然后输出节点的tag,然后在判断是否存在右节点。存在递归,

 /**
     *          A
     *      B         C
     *   D      E         F
     *
     * 中序遍历 DBEACF
     */
    public void inorderTraversal(TreeNode treeNode){
        if (treeNode==null)
            return;
        if (treeNode.getLeftNode()!=null)
            inorderTraversal(treeNode.getLeftNode());
        System.out.print(treeNode.getTag());
        if (treeNode.getRightNode()!=null)
            inorderTraversal(treeNode.getRightNode());
    }

2.4后序遍历

递归参数:TreeNode
核心思想:先判断是否存在左节点。存在的话递归。然后在判断是否存在右节点。存在递归。然后输出节点的tag。

 /**
     *          A
     *      B         C
     *   D      E         F
     *
     * 后序遍历 DEBFCA
     */
    public void afterOrderTraversal(TreeNode treeNode){
        if (treeNode==null)
            return;
        if (treeNode.getLeftNode()!=null)
            afterOrderTraversal(treeNode.getLeftNode());
        if (treeNode.getRightNode()!=null)
            afterOrderTraversal(treeNode.getRightNode());
        System.out.print(treeNode.getTag());
    }

2.5删除节点:
节点的删除和节点的插入思想一样。实现代码

 /**
     * 删除节点
     * @param delete
     */
    public void deleteNode(TreeNode delete,TreeNode rootNode){
        if (delete==null)
            return;
        if (rootNode.getNumber()==delete.getNumber()){
            rootNode=null;
            return;
        }
        if (rootNode.getLeftNode()!=null){
            if (rootNode.getLeftNode().getNumber()==delete.getNumber()){
                rootNode.setLeftNode(null);
            }else {
                deleteNode(delete, rootNode.getLeftNode());
            }
        }
        if (rootNode.getRightNode()!=null){
            if (rootNode.getRightNode().getNumber()==delete.getNumber()){
                rootNode.setRightNode(null);
            }else {
                deleteNode(delete, rootNode.getRightNode());
            }
        }
    }

总体来说:二叉树的递归实现还是比较简单的,下一篇将二叉树的非递归算法。
完整代码:

import java.util.ArrayList;
import java.util.List;

/**
 * Created by wxy on 2017/6/4.
 */
public class BinaryTree {

    public TreeNode rootNode;
    public void buildTree(TreeNode treeNode,TreeNode binaryTree){
        if (rootNode==null){
           rootNode=treeNode;
           rootNode.setLeftNode(null);
           rootNode.setRightNode(null);
           return;
        }
        if (treeNode.getNumber()<binaryTree.getNumber()){
            if (binaryTree.getLeftNode()!=null){
                buildTree(treeNode,binaryTree.getLeftNode());
            }else {
                binaryTree.setLeftNode(treeNode);
            }
        }else {
            if (binaryTree.getRightNode()!=null){
                buildTree(treeNode,binaryTree.getRightNode());
            }else {
                binaryTree.setRightNode(treeNode);
            }
        }
    }


    /**
     *          A
     *      B         C
     *   D      E         F
     *
     * 前序遍历 ABDECF
     */
    public void preorderTraversal(TreeNode treeNode){
        if (treeNode==null)
            return;
        System.out.print(treeNode.getTag());
        if (treeNode.getLeftNode()!=null)
             preorderTraversal(treeNode.getLeftNode());
        if (treeNode.getRightNode()!=null)
            preorderTraversal(treeNode.getRightNode());

    }



    /**
     *          A
     *      B         C
     *   D      E         F
     *
     * 中序遍历 DBEACF
     */
    public void inorderTraversal(TreeNode treeNode){
        if (treeNode==null)
            return;
        if (treeNode.getLeftNode()!=null)
            inorderTraversal(treeNode.getLeftNode());
        System.out.print(treeNode.getTag());
        if (treeNode.getRightNode()!=null)
            inorderTraversal(treeNode.getRightNode());
    }

    /**
     *          A
     *      B         C
     *   D      E         F
     *
     * 后序遍历 DEBFCA
     */
    public void afterOrderTraversal(TreeNode treeNode){
        if (treeNode==null)
            return;
        if (treeNode.getLeftNode()!=null)
            afterOrderTraversal(treeNode.getLeftNode());
        if (treeNode.getRightNode()!=null)
            afterOrderTraversal(treeNode.getRightNode());
        System.out.print(treeNode.getTag());
    }


    /**
     * 删除节点
     * @param delete
     */
    public void deleteNode(TreeNode delete,TreeNode rootNode){
        if (delete==null)
            return;
        if (rootNode.getNumber()==delete.getNumber()){
            rootNode=null;
            return;
        }
        if (rootNode.getLeftNode()!=null){
            if (rootNode.getLeftNode().getNumber()==delete.getNumber()){
                rootNode.setLeftNode(null);
            }else {
                deleteNode(delete, rootNode.getLeftNode());
            }
        }
        if (rootNode.getRightNode()!=null){
            if (rootNode.getRightNode().getNumber()==delete.getNumber()){
                rootNode.setRightNode(null);
            }else {
                deleteNode(delete, rootNode.getRightNode());
            }
        }
    }


    public static void main(String args[]){
        BinaryTree binaryTree=new BinaryTree();
        List<TreeNode>treeNodes=new ArrayList<>();
        treeNodes.add(new TreeNode("A",6));
        treeNodes.add(new TreeNode("B",3));
        treeNodes.add(new TreeNode("C",7));
        treeNodes.add(new TreeNode("D",1));
        treeNodes.add(new TreeNode("E",4));
        treeNodes.add(new TreeNode("F",9));
        treeNodes.forEach(treeNode -> {binaryTree.buildTree(treeNode,binaryTree.rootNode);});
        System.out.print("前序遍历  ");
        binaryTree.preorderTraversal(binaryTree.rootNode);
        System.out.print("\n"+"中序遍历  ");
        binaryTree.inorderTraversal(binaryTree.rootNode);
        System.out.print("\n"+"后序遍历  ");
        binaryTree.afterOrderTraversal(binaryTree.rootNode);
        System.out.print("\n"+"删除节点B  ");
        binaryTree.deleteNode(treeNodes.get(4),binaryTree.rootNode);
        binaryTree.preorderTraversal(binaryTree.rootNode);
        binaryTree.inorderTraversal(binaryTree.rootNode);
        binaryTree.afterOrderTraversal(binaryTree.rootNode);
    }

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容