数据结构 java版 线索二叉树

文章目录

  • 一、线索二叉树
    • 1.1 结构
    • 1.2 线索二叉树的建立(中序)
    • 1.3 线索二叉树的遍历
    • 1.4 测试

一、线索二叉树

1.1 结构

标志位为0时表示节点的对应lnode,rnode保存的是左右子树的引用,否则保存的是前驱节点或者后驱节点的引用。

public class node {
	// 节点的权值ֵ
	public int value;
	//左子树和右子树
	public node lNode;
	public node rNode;
    //左标记
	public int lflag = 0;
	//右标记
	public int rflag = 0;
}

1.2 线索二叉树的建立(中序)

  • 先处理最左的左子节点
  • 再处理前驱节点(相当于根节点)
  • 最后处理右子树
/**
	 * 中序建立线索二叉树
	 */
	// 中序建立二叉树
	public void setBinTree(node node) {
		if (node == null)
			return;
		// 处理左子树
		if (node.lNode != null) {
			setBinTree(node.lNode);
		}
		if (node.lNode == null) {
			node.lNode = pre;
			node.lflag = 1;
		}
		// 处理前驱节点(可以看做根节点)
		if (pre != null && pre.rNode == null) {
			pre.rNode = node;
			pre.rflag = 1;
		}
		// 记录当前的节点然后处理右子树
		pre = node;
		// 处理后驱节点(右子树)
		if (node.rNode != null)
			setBinTree(node.rNode);
	}

1.3 线索二叉树的遍历

  • 找到开始的节点(最左子树)
  • 按照线索往下查找
  • 跳过不具有线索的节点,让他指向右子节点。循环步骤
//遍历线索二叉树
	public void Search(){
		node start = this;
		while(start != null){
			//寻找最左边的那个节点
			while(start.lflag == 0){
				start = start.lNode;
			}
			System.out.println(start.value);
			//开始用线索遍历
			while(start.rflag == 1){
				start = start.rNode;
				System.out.println(start.value);				
			}
			//跳过非线索点
			start = start.rNode;
		}
	}	
}


public void Search(){
		if(root == null){
			return;
		}
		else root.Search();
	}

1.4 测试

package threadBibaryTree;


public class test {
	public static void main(String[] args) {
		node root0 = new node(0);
		root root = new root();
		root.setRoot(root0);
		node root1 = new node(1);
		node root2 = new node(2);
		node root3 = new node(3);
		node root4 = new node(4);
		node root5 = new node(5);
		node root6 = new node(6);
		root0.lNode = root1;
		root0.rNode = root2;
		root1.lNode = root3;
		root1.rNode = root4;
		root2.lNode = root5;
		root2.rNode = root6;
		root.middBinTree();
		root.Search();
	}
}

结果:
3
1
4
0
5
2
6

你可能感兴趣的:(数据结构与算法)