1、前序和中序線索二叉樹 思路就是構建個pre指針,在交換時,注意pre和curNode節點的指針指向問題
- 代碼:
package tree;
import javax.xml.soap.Node;
public class ThreadBinaryTreeDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
//1、**************演示前中後序打印結果***************
// TODO Auto-generated method stub
ThreadBinaryTreeNode binaryTreeNode1 = new ThreadBinaryTreeNode(1, "宋江");
ThreadBinaryTreeNode binaryTreeNode2 = new ThreadBinaryTreeNode(2, "林沖");
ThreadBinaryTreeNode binaryTreeNode3 = new ThreadBinaryTreeNode(3, "盧俊義");
ThreadBinaryTreeNode binaryTreeNode4 = new ThreadBinaryTreeNode(4, "武大郎");
ThreadBinaryTreeNode binaryTreeNode5 = new ThreadBinaryTreeNode(5, "智多星");
ThreadBinaryTreeNode binaryTreeNode6 = new ThreadBinaryTreeNode(6, "及時雨");
binaryTreeNode1.setLeftNode(binaryTreeNode2);
binaryTreeNode1.setRightNode(binaryTreeNode4);
binaryTreeNode2.setLeftNode(binaryTreeNode3);
binaryTreeNode4.setLeftNode(binaryTreeNode5);
binaryTreeNode4.setRightNode(binaryTreeNode6);
ThreadBinaryTree binaryTree = new ThreadBinaryTree(binaryTreeNode1);//root
// binaryTree.infixthread(binaryTreeNode1);
// binaryTree.preThread(binaryTreeNode1);
// binaryTree.infixOut();
// binaryTree.preOut();
// System.out.println(binaryTreeNode2.getRightNode());
}
}
//構建線索二叉樹
class ThreadBinaryTree{
private ThreadBinaryTreeNode root;
private ThreadBinaryTreeNode pre = null;
public ThreadBinaryTree(ThreadBinaryTreeNode root) {
super();
this.root = root;
}
//中序線索二叉樹
public void infixthread(ThreadBinaryTreeNode node) {
if(node == null) {
return;
}
//左
infixthread(node.getLeftNode());
//
if(node.getLeftNode() == null) {
node.setLeftNode(pre);
node.setLeftType(1);
}
if(pre != null && pre.getRightNode() == null) {
pre.setRightNode(node);
pre.setRightType(1);
}
pre = node;
//右
infixthread(node.getRightNode());
}
//中序遍歷線索二叉樹
public void infixOut() {
if(root == null) {
return;
}
ThreadBinaryTreeNode temp = root;
while(temp != null) {
while(temp.getLeftType() == 0) {
temp = temp.getLeftNode();
}
System.out.println(temp.toString());
while(temp.getRightType() == 1) {
temp = temp.getRightNode();
System.out.println(temp.toString());
}
temp = temp.getRightNode();
}
}
//前序線索二叉樹
public void preThread(ThreadBinaryTreeNode node) {
if(node == null) {
return;
}
//
if(node.getLeftNode() == null) {
node.setLeftNode(pre);
node.setLeftType(1);
}
if(pre != null && pre.getRightNode() == null) {
pre.setRightNode(node);
pre.setRightType(1);
}
pre = node;
if(node.getLeftType() == 0) {
preThread(node.getLeftNode());
}
if(node.getRightType() == 0) {
preThread(node.getRightNode());
}
}
//前序遍歷線索二叉樹
public void preOut() {
if(root == null) {
return;
}
ThreadBinaryTreeNode temp = root;
while(temp != null) {
System.out.println(temp.toString());
while(temp.getLeftType() == 0) {
temp = temp.getLeftNode();
System.out.println(temp.toString());
}
temp = temp.getRightNode();
}
}
}
//定義線索二叉樹的節點
class ThreadBinaryTreeNode{
private int no;
private String name;
private ThreadBinaryTreeNode leftNode;//默認爲空
private ThreadBinaryTreeNode rightNode;//默認爲空
private int leftType;//左節點的類型,0:左子樹;1:左前驅
private int rightType;//右節點的類型,0:右子樹;1:右後繼
//構造函數
public ThreadBinaryTreeNode(int no, String name) {
super();
this.no = no;
this.name = name;
}
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;
}
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 ThreadBinaryTreeNode getLeftNode() {
return leftNode;
}
public void setLeftNode(ThreadBinaryTreeNode leftNode) {
this.leftNode = leftNode;
}
public ThreadBinaryTreeNode getRightNode() {
return rightNode;
}
public void setRightNode(ThreadBinaryTreeNode rightNode) {
this.rightNode = rightNode;
}
@Override
public String toString() {
return "BinaryTreeNode [no=" + no + ", name=" + name + "]";
}
}