本文主要是介绍二叉树的线索化及遍历,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
一、需求
二、前序线索化
2.1 前序线索化图解
2.2 前序线索化代码实现
2.3 前序线索化的遍历
三、中序线索化
3.1 中序线索化图解
3.2 中序线索化代码实现
3.3 中序线索化的遍历
四、后序线索化
4.1 后序线索化图解
4.2 后序线索化代码实现
五、完整代码
一、需求
/** 需求:实现线索化二叉树* 分析:* A:因为结点的指针可能指向树或者前驱或者后继,为了分辨,需要增加结点的属性;* a:当leftType=0时表示指向左子树,leftType=1表示指向前驱;* b:当rightType=0表示指向右子树,rightType=1表示指向后继;* B:进行前序线索化时,遵循的原则是'根左右',要解决的问题是结点的前驱和后继问题,* 关于中序、后序线索化同理;*/
二、前序线索化
2.1 前序线索化图解
蓝线表示树枝,红线表示线索。
2.2 前序线索化代码实现
/*** 这个方法是二叉树的前序线索化*/public void preThreadedNodes(HeroNode node) {if(node == null) {return;}//线索化当前结点if(node.getLeft() == null) {node.setLeft(pre);node.setLeftType(1);}//第二个pre敲成了node,找了两天。。。if(pre != null && pre.getRight() == null) {pre.setRight(node);pre.setRightType(1);}pre = node;//线索化左子树if(node.getLeftType() == 0) {preThreadedNodes(node.getLeft());}//线索化右子树if(node.getRightType() == 0) {preThreadedNodes(node.getRight());}}
2.3 前序线索化的遍历
/*** 前序遍历线索二叉树的方法*/public void preThreadedList() {HeroNode node = root;while(node != null) {while(node.getLeftType() == 0) {System.out.println(node);node = node.getLeft();}System.out.println(node);node = node.getRight();}}
三、中序线索化
3.1 中序线索化图解
3.2 中序线索化代码实现
/*** 这个方法是二叉树的中序线索化* @param node 当前需要线索化的结点*/public void infixThreadedNodes(HeroNode node) {if(node == null) {return;}infixThreadedNodes(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 = node;infixThreadedNodes(node.getRight());}
3.3 中序线索化的遍历
/*** 中序遍历线索二叉树的方法*/public void infixThreadedList() {//定义临时变量HeroNode node = root;while(node != null) {//找到leftType=1的结点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();}}
四、后序线索化
4.1 后序线索化图解
4.2 后序线索化代码实现
/*** 这个方法是二叉树的后序线索化* @param node*/public void postThreadedNodes(HeroNode node) {if(node == null) {return;}postThreadedNodes(node.getLeft());postThreadedNodes(node.getRight());if(node.getLeft() == null) {node.setLeft(pre);node.setLeftType(1);}if(pre != null && pre.getRight() == null) {pre.setRight(node);pre.setRightType(1);}pre = node;}
五、完整代码
package tree.find;/** 需求:实现线索化二叉树* 分析:* A:因为结点的指针可能指向树或者前驱或者后继,为了分辨,需要增加结点的属性;* a:当leftType=0时表示指向左子树,leftType=1表示指向前驱;* b:当rightType=0表示指向右子树,rightType=1表示指向后继;*/
public class ThreadedBinaryTreeDemo {public static void main(String[] args) {// 定义结点HeroNode root = new HeroNode(1, "tom");HeroNode node2 = new HeroNode(3, "jack");HeroNode node3 = new HeroNode(6, "simth");HeroNode node4 = new HeroNode(8, "mary");HeroNode node5 = new HeroNode(10, "king");HeroNode node6 = new HeroNode(14, "dim");// 手动创建root.setLeft(node2);root.setRight(node3);node2.setLeft(node4);node2.setRight(node5);node3.setLeft(node6);// 创建线索二叉树对象ThreadedBinaryTree tb = new ThreadedBinaryTree();tb.setRoot(root);/** //测试前序线索化 tb.preThreadedNodes(); System.out.println("前序遍历结果为:");* tb.preThreadedList();*/// 测试中序线索化tb.infixThreadedNodes();System.out.println("中序遍历结果为:");tb.infixThreadedList();}}// 定义ThreadedBinaryTree二叉树
class ThreadedBinaryTree {private HeroNode root;// 增加前驱结点属性private HeroNode pre = null;public void setRoot(HeroNode root) {this.root = root;}// 重载线索化方法public void preThreadedNodes() {this.preThreadedNodes(root);}public void infixThreadedNodes() {this.infixThreadedNodes(root);}/*** 这个方法是二叉树的前序线索化*/public void preThreadedNodes(HeroNode node) {if (node == null) {return;}// 线索化当前结点if (node.getLeft() == null) {node.setLeft(pre);node.setLeftType(1);}// 第二个pre敲成了node,找了两天。。。if (pre != null && pre.getRight() == null) {pre.setRight(node);pre.setRightType(1);}pre = node;// 线索化左子树if (node.getLeftType() == 0) {preThreadedNodes(node.getLeft());}// 线索化右子树if (node.getRightType() == 0) {preThreadedNodes(node.getRight());}}/*** 这个方法是二叉树的中序线索化* * @param node* 当前需要线索化的结点*/public void infixThreadedNodes(HeroNode node) {if (node == null) {return;}infixThreadedNodes(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 = node;infixThreadedNodes(node.getRight());}/*** 这个方法是二叉树的后序线索化* * @param node*/public void postThreadedNodes(HeroNode node) {if (node == null) {return;}postThreadedNodes(node.getLeft());postThreadedNodes(node.getRight());if (node.getLeft() == null) {node.setLeft(pre);node.setLeftType(1);}if (pre != null && pre.getRight() == null) {pre.setRight(node);pre.setRightType(1);}pre = node;}/*** 前序遍历线索二叉树的方法*/public void preThreadedList() {HeroNode node = root;while (node != null) {while (node.getLeftType() == 0) {System.out.println(node);node = node.getLeft();}System.out.println(node);node = node.getRight();}}/*** 中序遍历线索二叉树的方法*/public void infixThreadedList() {// 定义临时变量HeroNode node = root;while (node != null) {// 找到leftType=1的结点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();}}/*** 后序遍历线索二叉树的方法*/public void postThreadedList() {HeroNode node = root;while (node.getLeftType() == 0) {node = node.getLeft();}System.out.println(node);}
}// 创建HeroNode结点
class HeroNode {private int id;private String name;private HeroNode left;private HeroNode right;// 增加结点属性private int leftType;private int rightType;// 构造方法public HeroNode(int id, String name) {this.id = id;this.name = name;}// 自动生成get,set方法public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public HeroNode getLeft() {return left;}public void setLeft(HeroNode left) {this.left = left;}public HeroNode getRight() {return right;}public void setRight(HeroNode 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;}// toString方法@Overridepublic String toString() {return "HeroNode [id=" + id + ", name=" + name + "]";}
}
这篇关于二叉树的线索化及遍历的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!