package tree; public class ThreadedBinaryTreeDemo { public static void main(String[] args) { HeroNode2 root = new HeroNode2(1,"宋江"); HeroNode2 node1 = new HeroNode2(3,"吴用"); HeroNode2 node2 = new HeroNode2(6,"卢俊义"); HeroNode2 node3 = new HeroNode2(8,"武松"); HeroNode2 node4 = new HeroNode2(10,"鲁智深"); HeroNode2 node5 = new HeroNode2(14,"花荣"); //手动生成树 root.setLeft(node1); root.setRight(node2); node1.setLeft(node3); node1.setRight(node4); node2.setLeft(node5); ThreadedBinaryTree tree = new ThreadedBinaryTree(); tree.setRoot(root); tree.thread(); System.out.println(node3.getLeft()); System.out.println(node3.getLeftType()); System.out.println(node3.getRight()); System.out.println(node3.getRightType()); System.out.println(node2.getLeft()); System.out.println(node2.getLeftType()); System.out.println(node2.getRight()); System.out.println(node2.getRightType()); tree.threadedList(); } } class ThreadedBinaryTree{ private HeroNode2 root; private HeroNode2 pre = null;//记录当前节点的前一个节点 public void setRoot(HeroNode2 root) { this.root = root; } public void thread(){ thread(root); } //线索化是将原本没有指向的节点添加节点信息 public void thread(HeroNode2 node){ if (node == null) { return; } if (node.getLeft() != null) { thread(node.getLeft()); } if (node.getLeft() == null) { node.setLeft(pre); node.setLeftType(1); } if (pre != null && pre.getRight() == null) { pre.setRight(node); pre.setRightType(1); } //处理完该节点后 pre后移 pre = node; if(node.getRight() != null){ thread(node.getRight()); } } public void threadedList(){ HeroNode2 node = root; while (node != null){ while (node.getLeftType() == 0){ node = node.getLeft(); } System.out.println(node); while (node.getRightType() == 1){ node = node.getRight(); System.out.println(node); } node = node.getRight(); } } } class HeroNode2{ private int no; private String name; private HeroNode2 left; private HeroNode2 right; private int leftType; private int rightType; public HeroNode2(int no, String name) { this.no = no; this.name = name; } //线索化 public int getNo() { return no; } public void setNo(int no) { this.no = no; } public String getName() { return name; } public void setName(String name) { this.name = name; } public HeroNode2 getLeft() { return left; } public void setLeft(HeroNode2 left) { this.left = left; } public HeroNode2 getRight() { return right; } public void setRight(HeroNode2 right) { this.right = right; } public int getLeftType() { return leftType; } public void setLeftType(int leftType) { this.leftType = leftType; } public int getRightType() { return rightType; } public void setRightType(int rightType) { this.rightType = rightType; } @Override public String toString() { return "HeroNode2{" + "no=" + no + ", name='" + name + '\'' + '}'; } }
Java数据结构《二叉树》中序线索化,遍历
最新推荐文章于 2024-07-06 22:34:06 发布