创建节点、包含插入、查找、删除节点
class Node {
int id;
Node left;
Node right;
public Node(int id) {
this.id = id;
}
public void pre(Node node) {
if(node==null) {
return ;
}
System.out.print(node.id + " ");
pre(node.left);
pre(node.right);
}
public Node preFind(int id, Node node) {
System.out.println("查找中");
if(node.id==id) {
return node;
}
Node temp = null;
if(node.left!=null) {
temp = preFind(id, node.left);
}
if(temp!=null) {
return temp;
}
if(node.right!=null) {
temp = preFind(id, node.right);
}
return temp;
}
public Node infixFind(int id, Node node) {
Node temp = null;
if(node.left!=null) {
temp = infixFind(id, node.left);
}
System.out.println("查找中");
if(node.id==id) {
return node;
}
if(temp!=null) {
return temp;
}
if(node.right!=null) {
temp = infixFind(id, node.right);
}
return temp;
}
public Node postFind(int id, Node node) {
Node temp = null;
if(node.left!=null) {
temp = postFind(id, node.left);
}
if(temp!=null) {
return temp;
}
if(node.right!=null) {
temp = postFind(id, node.right);
}
System.out.println("查找中");
if(node.id==id) {
return node;
}
return temp;
}
public boolean deleteNode(int id, Node node) {
if(node == null) {
return false;
}
if(node.left.id == id) {
Node temp = node.left;
if(temp.left ==null && temp.right == null) {
node.left = null;
} else if (temp.left != null && temp.right != null) {
node.left = temp.left;
temp.left.right = temp.right;
} else if (temp.left != null) {
node.left = temp.left;
} else if (temp.right != null) {
node.left = temp.right;
}
return true;
}
if(node.right.id == id){
Node temp = node.right;
if(temp.left ==null && temp.right == null) {
node.right = null;
} else if (temp.left != null && temp.right != null) {
node.right = temp.left;
temp.left.right = temp.right;
} else if (temp.left != null) {
node.right = temp.left;
} else if (temp.right != null) {
node.right = temp.right;
}
return true;
}
boolean flag = false;
flag = deleteNode(id, node.left);
if(!flag) {
flag = deleteNode(id, node.right);
}
return flag;
}
}
创建树
class BinaryTree {
Node root = null;
public BinaryTree(Node root) {
this.root = root;
}
public void preFind(int id) {
if(root == null) {
System.out.println("树为空");
return ;
}
Node temp = root.preFind(id, root);
System.out.println(temp);
}
public void infixFind(int id) {
if(root == null) {
System.out.println("树为空");
return ;
}
Node temp = root.infixFind(id, root);
System.out.println(temp);
}
public void postFind(int id) {
if(root == null) {
System.out.println("树为空");
return ;
}
Node temp = root.postFind(id, root);
System.out.println(temp);
}
public boolean deleteNode(int id) {
if(root == null) {
return false;
}
return root.deleteNode(id, root);
}
public void pre() {
root.pre(root);
}
}
测试
public class TraversalTree {
public static void main(String[] args) {
Node root = new Node(1);
Node node1 = new Node(2);
Node node2 = new Node(3);
Node node3 = new Node(4);
Node node4 = new Node(5);
Node node5 = new Node(6);
System.out.println(root + " " + node1 + " " + node2 + " " + node3 + " " + node4);
root.left = node1;
root.right = node2;
node2.left = node3;
node2.right = node4;
node1.left = node5;
BinaryTree tree = new BinaryTree(root);
tree.pre();
System.out.println("-----------------------------------------------------------------------------");
tree.deleteNode(3);
tree.pre();
}
}
二叉树的迭代遍历
public void preTraversal() {
if(root == null) {
System.out.println("树为空");
}
Stack<Node> stack = new Stack<>();
Node temp = root;
stack.add(temp);
while(!stack.isEmpty()) {
temp = stack.pop();
System.out.print(temp.id + " ");
if(temp.right!=null) {
stack.add(temp.right);
}
if(temp.left!=null) {
stack.add(temp.left);
}
}
}
public void infixTraversal() {
if(root == null) {
System.out.println("树为空");
}
Stack<Node> stack = new Stack<>();
Node temp = root;
while(temp!=null || !stack.isEmpty()) {
while(temp!=null) {
stack.add(temp);
temp = temp.left;
}
if(!stack.isEmpty()) {
temp = stack.pop();
System.out.print(temp.id + " ");
temp = temp.right;
}
}
}
public void postTraversal() {
if(root == null) {
System.out.println("树为空");
}
Stack<Node> stack = new Stack<>();
List<Integer> list = new ArrayList<Integer>();
Node temp = root;
stack.add(temp);
while(!stack.isEmpty()) {
temp = stack.pop();
list.add(temp.id);
if(temp.left!=null) {
stack.add(temp.left);
}
if(temp.right!=null) {
stack.add(temp.right);
}
}
Collections.reverse(list);
System.out.println(list);
}