重构二叉树_java_徒手撕

前言

在学习了二叉树后,根据二叉树的增加节点的原理,进行二叉树的重构。

1.定义节点TreeNode.java

package com.yxf;

/**
 * 节点
 */
public class TreeNode {

    private TreeNode parentNode;
    private TreeNode leftNode;
    private TreeNode rightNode;
    private Integer value;
    public TreeNode(Integer value){
        this.value = value;
    }

    public TreeNode getParentNode() {
        return parentNode;
    }

    public void setParentNode(TreeNode parentNode) {
        this.parentNode = parentNode;
    }

    public TreeNode getLeftNode() {
        return leftNode;
    }

    public void setLeftNode(TreeNode leftNode) {
        this.leftNode = leftNode;
    }

    public TreeNode getRightNode() {
        return rightNode;
    }

    public void setRightNode(TreeNode rightNode) {
        this.rightNode = rightNode;
    }

    public Integer getValue() {
        return value;
    }

    public void setValue(Integer value) {
        this.value = value;
    }

}

2.根据节点构建二叉树BinaryTree.java

package com.yxf;

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

public class BinaryTree {
    private TreeNode root;

    /**
     * 根节点一定要有
     */
    public BinaryTree(TreeNode node){
        root = node;
        root.setParentNode(null);
    }

    /**
     * 增加节点
     */
    public void addTreeNode(TreeNode node){
        //新来一个节点,需要从根节点开始判断加在哪边
        this.addDG(root, node);
    }

    //递归
    private void addDG(TreeNode currentNode,TreeNode node){
        //如果大于当前节点的值,往右插
        if(node.getValue()>currentNode.getValue()){
            if(currentNode.getRightNode()==null){
                node.setParentNode(currentNode);
                currentNode.setRightNode(node);
            }else {
                //递归往下
                addDG(currentNode.getRightNode(),node);
            }
        }else {
            if(currentNode.getLeftNode()==null){
                node.setParentNode(currentNode);
                currentNode.setLeftNode(node);
            }else {
                //往下递归
                addDG(currentNode.getLeftNode(),node);
            }
        }
    }

    /**
     * 删除节点,只能从叶子节点开始删???
     */
    public void deleteTreeNOde(){

    }

    /**
     * 前序遍历
     */

    public List<Integer> getDLR(){
        List<Integer> list = new ArrayList<>();
        this.getDLRDG(root,list);
        return list;
    }

    private void getDLRDG(TreeNode node,List<Integer> list){
        list.add(node.getValue());
        if(node.getLeftNode()!=null){
            getDLRDG(node.getLeftNode(),list);
        }
        if(node.getRightNode()!=null){
            getDLRDG(node.getRightNode(),list);
        }
    }

    /**
     * 中序遍历
     */
    public List<Integer> getLDR(){
        List<Integer> list = new ArrayList<>();
        this.getLDRDG(root,list);
        return list;
    }

    private void getLDRDG(TreeNode node,List<Integer> list){
        if(node.getLeftNode()!=null){
            getLDRDG(node.getLeftNode(),list);
        }
        list.add(node.getValue());
        if(node.getRightNode()!=null){
            getLDRDG(node.getRightNode(),list);
        }
    }

    /**
     * 后序遍历
     */
    public List<Integer> getLRD(){
        List<Integer> list = new ArrayList<>();
        this.getLRDDG(root,list);
        return list;
    }

    private void getLRDDG(TreeNode node,List<Integer> list){
        if(node.getLeftNode()!=null){
            getLRDDG(node.getLeftNode(),list);
        }
        if(node.getRightNode()!=null){
            getLRDDG(node.getRightNode(),list);
        }
        list.add(node.getValue());
    }

}

3.测试,验证树结构Btest.java

package com.test;

import com.yxf.BinaryTree;
import com.yxf.TreeNode;

import java.util.List;

public class Btest {
    public static void main(String[] args) {
        TreeNode root = new TreeNode(12);
        BinaryTree bTree = new BinaryTree(root);
        bTree.addTreeNode(new TreeNode(15));
        bTree.addTreeNode(new TreeNode(5));
        bTree.addTreeNode(new TreeNode(3));
        bTree.addTreeNode(new TreeNode(6));
        bTree.addTreeNode(new TreeNode(4));
        bTree.addTreeNode(new TreeNode(2));
        bTree.addTreeNode(new TreeNode(7));
        bTree.addTreeNode(new TreeNode(13));
        bTree.addTreeNode(new TreeNode(14));
        bTree.addTreeNode(new TreeNode(38));
        List<Integer> dlr = bTree.getDLR();//前序遍历
        List<Integer> ldr = bTree.getLDR();//中序遍历
        List<Integer> lrd = bTree.getLRD();//后序遍历
        System.out.println(dlr);
        System.out.println(ldr);
        System.out.println(lrd);
    }
}

手动添加节点,画图验证,比对输出结果,没问题!
在这里插入图片描述
在这里插入图片描述


在输出树结构root的时候报栈溢出了…暂时不知道咋回事


顺着来会了,那倒着来呢,根据已知的前序、中序;或 中序、后序,怎样构建出一个二叉树呢?
参考如下:
https://blog.csdn.net/wangbingcsu/article/details/51372695

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值