前言
在学习了二叉树后,根据二叉树的增加节点的原理,进行二叉树的重构。
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