题目:设计一个递归的线性算法,该算法测试一棵二叉树是否在每一个节点都满足查找树序的性质
代码如下:
package Test;
public class Test32 {
private static class TreeNode{
public TreeNode(int element) {
this(element,null,null,0);
}
public TreeNode(int element, TreeNode left, TreeNode right,int flag) {
super();
this.element = element;
this.left = left;
this.right = right;
flag = 0;
}
int element;
TreeNode left;
TreeNode right;
int flag;
}
public static TreeNode root;
//创建一棵二叉树
public void creatBinaryTree() {
root = new TreeNode(10);
TreeNode NodeB = new TreeNode(13);
TreeNode NodeC = new TreeNode(7);
TreeNode NodeD = new TreeNode(3);
TreeNode NodeE = new TreeNode(8);
TreeNode NodeF = new TreeNode(9);
root.left = NodeB;
root.right = NodeC;
NodeB.left= NodeD;
NodeB.right = NodeE;
NodeC.right = NodeF;
}
//测试二叉树是否在每一个结点都满足查找树的序的性质
//其中满足的结点,标记为0;不满足的节点标记为1
public void satisfy(TreeNode t) {
if(t == null)
t.flag = 0;
if(t.left != null&&t.right != null) {
if (t.left.element<t.element && t.right.element>t.element) {
//t.flag = 0;
}else {
t.flag = 1;
satisfy(t.left);
satisfy(t.right);
}
}else if (t.left != null) {
if (t.left.element<t.element) {
//t.flag = 0;
}else {
t.flag = 1;
satisfy(t.left);
satisfy(t.right);
}
}else if (t.right != null) {
if (t.right.element>t.element) {
//t.flag = 0;
}else {
t.flag = 1;
satisfy(t.left);
satisfy(t.right);
}
}else {
//t.flag = 0;
}
}
//前序遍历法
public void preOrder(TreeNode t) {
if(t == null)
return;
System.out.println(t.element+"标记为"+t.flag);
preOrder(t.left);
preOrder(t.right);
}
public static void main(String[] args) {
Test32 t = new Test32();
t.creatBinaryTree();
System.out.println("------标记前-----");
t.preOrder(root);
System.out.println("------标记后-----");
t.satisfy(root);
t.preOrder(root);
}
}
结果:
------标记前-----
10标记为0
13标记为0
3标记为0
8标记为0
7标记为0
9标记为0
------标记后-----
10标记为1
13标记为1
3标记为0
8标记为0
7标记为0
9标记为0
方法过于简单,深入学习后再改进吧