程序员:数据结构和算法,中序线索化二叉树

1、中序线索化二叉树

  创建如上的二叉树,线索化二叉树时,根据指定的遍历方式得到的节点的访问顺序,一个节点前面的节点,叫做前驱节点,一个节点后面的节点,叫做后继节点。

  线索化二叉树的规则:

  按照某一遍历规则。记录当前节点(cur),上次访问的节点(pre)。

   ① 如果当前节点的左孩子为空 (cur.leftNode == null),就让当前节点的左指针指向它的前驱节点 ,并把当前节点左指针的模式修改为线索类型 (cur.leftNode = pre ,cur.leftType = 1)。

   ② 如果当前节点的前驱节点的右孩子为空 (pre.rightNode == null),就让当前节点的前驱节点的右指针指向当前节点,并把前驱节点的右指针修改为线索类型 (pre.rightNode = cur ,pre.rightType = 1)。

代码实现:

/**

* 线索二叉树节点

*/

public class ThreadedNode {

//节点的权

int value;

//节点的左右孩子节点

ThreadedNode leftNode;

ThreadedNode rightNode;

//表示指针的类型

int leftType;

int rightType;

//设置节点的权值

public ThreadedNode(int value) {

this.value = value;

}

//设置节点的左右孩子节点

public void setLeftNode(ThreadedNode leftNode) {

this.leftNode = leftNode;

}

public void setRightNode(ThreadedNode rightNode) {

this.rightNode = rightNode;

}

//获取节点的左右孩子节点

public ThreadedNode getLeftNode() {

return this.leftNode;

}

public ThreadedNode getRightNode() {

return this.rightNode;

}

public void midShow() {

//先遍历左子树

if (this.leftNode != null){

leftNode.midShow();

}

//打印当前节点的权值

System.out.println(this.value);

if (this.rightNode != null){

rightNode.midShow();

}

}

}

/**

* 线索二叉树

*/

public class ThreadedBinaryTree {

//树的根节点

ThreadedNode rootNode;

//用于临时存储前驱节点

ThreadedNode pre = null;

//设置二叉树的根节点

public void setRootNode(ThreadedNode rootNode) {

this.rootNode = rootNode;

}

//获取二叉树的根节点

public ThreadedNode getRootNode() {

return this.rootNode;

}

//中序线索化二叉树

public void threadNode() {

threadNodes(rootNode);

}

private void threadNodes(ThreadedNode node) {

//当前节点为空,直接返回

if (node == null) {

return;

}

//处理左子树

threadNodes(node.leftNode);

//处理前驱节点

if (pre != null && node.leftNode == null) {

//当前节点的左指针指向前驱节点

node.leftNode = pre;

//修改节点为线索模式

node.leftType = 1;

}

//处理前驱节点的右指针

if (pre != null && pre.rightNode == null) {

pre.rightNode = node;

pre.rightType = 1;

}

//当前节点就是下一个节点的前驱节点

pre = node;

//处理右子树

threadNodes(node.rightNode);

}

//中序遍历二叉树

public void midShow() {

if (this.rootNode == null) {

return;

} else {

rootNode.midShow();

}

}

}

/**

* 测试类

*/

public class TestThreadedBinaryTree {

public static void main(String[] args) {

//1、创建二叉树

ThreadedBinaryTree binaryTree = new ThreadedBinaryTree();

ThreadedNode rootNode = new ThreadedNode(1);

binaryTree.setRootNode(rootNode);

ThreadedNode leftNode = new ThreadedNode(2);

ThreadedNode rightNode = new ThreadedNode(3);

rootNode.setLeftNode(leftNode);

rootNode.setRightNode(rightNode);

leftNode.setLeftNode(new ThreadedNode(4));

ThreadedNode five = new ThreadedNode(5);

leftNode.setRightNode(five);

rightNode.setLeftNode(new ThreadedNode(6));

rightNode.setRightNode(new ThreadedNode(7));

//2、中序遍历二叉树

System.out.println("中序遍历结果:");

binaryTree.midShow();

System.out.println("------------------------");

binaryTree.threadNode();

ThreadedNode beforeNode = five.leftNode;

System.out.println("节点5的前驱节点:"+beforeNode.value);

ThreadedNode afterNode = five.rightNode;

System.out.println("节点5的后继节点:"+afterNode.value);

}

}

程序员:数据结构和算法,中序线索化二叉树