二叉树的代码稍微有点抽象,并且运用了递归,猛一看会有点难以理解,建议在了解理论知识的前提下,在草稿纸上画一个二叉树,结合代码实现线索二叉树。
1.定义结点package tree.cluetree; public class Node { private int no; private String name; private Node left; private Node right; // 0表示左子树 1表示前驱结点 private int noLeft; // 0表示右子树 1表示后继结点 private int noRight; @Override public String toString() { return "Node{" + "no=" + no + ", 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 Node getLeft() { return left; } public void setLeft(Node left) { this.left = left; } public Node getRight() { return right; } public void setRight(Node right) { this.right = right; } public int getNoLeft() { return noLeft; } public void setNoLeft(int noLeft) { this.noLeft = noLeft; } public int getNoRight() { return noRight; } public void setNoRight(int noRight) { this.noRight = noRight; } public Node(int no, String name) { this.no = no; this.name = name; } }2.定义线索二叉树
package tree.cluetree; public class ClueTree { private Node root; // 初始化前驱结点 private Node pre = null; public void setRoot(Node root) { this.root = root; } public void clueNode(Node node) { if (node == null) { return; } // 线索化左子树 clueNode(node.getLeft()); // 左下结点为中序遍历第一个结点,前驱结点设为空 if (node.getLeft() == null) { node.setLeft(pre); node.setNoLeft(1); } // 如果当前节点的前驱结点不为空并且其右子树为空,则把当前结点设为其前驱结点的后继结点 if (pre != null && pre.getRight() == null) { pre.setRight(node); pre.setNoRight(1); } pre = node; clueNode(node.getRight()); } // 中序遍历线索二叉树 public void clueList() { Node node = root; while (node != null) { while (node.getNoLeft() == 0) { node = node.getLeft(); } System.out.println(node); while (node.getNoRight() == 1) { node = node.getRight(); System.out.println(node); } node = node.getRight(); } } }3.简单测试
package tree.cluetree; import tree.cluetree.Node; public class Test { public static void main(String[] args) { Node root = new Node(0, "zzz"); Node node1 = new Node(1, "aaa"); Node node2 = new Node(2, "bbb"); Node node3 = new Node(3, "ccc"); Node node4 = new Node(4, "ddd"); Node node5 = new Node(5, "eee"); Node node6 = new Node(6, "fff"); root.setLeft(node1); root.setRight(node2); node1.setLeft(node3); node1.setRight(node4); node2.setLeft(node5); node2.setRight(node6); ClueTree t = new ClueTree(); t.setRoot(root); // 把普通二叉树线索化为线索二叉树 t.clueNode(root); t.clueList(); System.out.println("node4节点的前驱是:" + node4.getLeft().getNo() + " 后继节点是:" + node4.getRight().getNo() ); } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)