算法整理03——二叉树(前序中序后续、各种二叉树判别方法)

前序:中左右;中序:左根右;后序:左右中

递归求解和非递归求解(利用到树的广度优先搜索和深度优先搜索)

import java.util.Stack;
/**
 * 实现二叉树的先序、 中序、 后序遍历, 包括递归方式和非递归方式
 * @author York
 *
 */
public class Code_01_PreInPosTraversal {
	//定义二叉树
	public static class Node {
		public int value;
		public Node left;
		public Node right;

		public Node(int data) {
			this.value = data;
		}
	}
	//xian先序遍历 先打印头部 再打印左子树 再右子树;
	public static void preOrderRecur(Node head) {
		if (head == null) {
			return;
		}
		//打印的时机 第一次来到这个节点 先序遍历
		System.out.print(head.value + " ");
		
		preOrderRecur(head.left);
		preOrderRecur(head.right);
	}

	public static void inOrderRecur(Node head) {
		if (head == null) {
			return;
		}
		inOrderRecur(head.left);
		//打印的时机 第二次来到这个节点 中序遍历
		System.out.print(head.value + " ");
		inOrderRecur(head.right);
	}

	public static void posOrderRecur(Node head) {
		if (head == null) {
			return;
		}
		posOrderRecur(head.left);
		posOrderRecur(head.right);
		//打印的时机 第三次来到这个节点 后序遍历
		System.out.print(head.value + " ");
	}

	public static void preOrderUnRecur(Node head) {
		System.out.print("pre-order: ");
		if (head != null) {
			Stack<Node> stack = new Stack<Node>();
			stack.add(head);
			while (!stack.isEmpty()) {
				head = stack.pop();
				System.out.print(head.value + " ");
				if (head.right != null) {
					stack.push(head.right);
				}
				if (head.left != null) {
					stack.push(head.left);
				}
			}
		}
		System.out.println();
	}
	
	public static void inOrderUnRecur(Node head) {
		System.out.println("中序:");
		if(head != null) {
			Stack<Node> stack = new Stack<>();
			while(!stack.isEmpty() || head != null ) {
				if(head.left != null) {
					stack.push(head.left);
					head = head.left;
				}else {
					head = stack.pop();
					System.out.println(head.value);
					head = head.right;
				}
			}
		}
		System.out.println();
	}
	public static void inOrderUnRecur2(Node head) {
		System.out.print("in-order: ");
		if (head != null) {
			Stack<Node> stack = new Stack<Node>();
			while (!stack.isEmpty() || head != null) {
				if (head != null) {
					stack.push(head);
					head = head.left;
				} else {
					head = stack.pop();
					System.out.print(head.value + " ");
					head = head.right;
				}
			}
		}
		System.out.println();
	}

	public static void posOrderUnRecur1(Node head) {
		System.out.print("pos-order: ");
		if (head != null) {
			Stack<Node> s1 = new Stack<Node>();
			Stack<Node> s2 = new Stack<Node>();
			s1.push(head);
			while (!s1.isEmpty()) {
				head = s1.pop();
				s2.push(head);
				if (head.left != null) {
					s1.push(head.left);
				}
				if (head.right != null) {
					s1.push(head.right);
				}
			}
			while (!s2.isEmpty()) {
				System.out.print(s2.pop().value + " ");
			}
		}
		System.out.println();
	}

	public static void posOrderUnRecur2(Node h) {
		System.out.print("pos-order: ");
		if (h != null) {
			Stack<Node> stack = new Stack<Node>();
			stack.push(h);
			Node c = null;
			while (!stack.isEmpty()) {
				c = stack.peek();
				if (c.left != null && h != c.left && h != c.right) {
					stack.push(c.left);
				} else if (c.right != null && h != c.right) {
					stack.push(c.right);
				} else {
					System.out.print(stack.pop().value + " ");
					h = c;
				}
			}
		}
		System.out.println();
	}

	public static void main(String[] args) {
		Node head = new Node(5);
		head.left = new Node(3);
		head.right = new Node(8);
		head.left.left = new Node(2);
		head.left.right = new Node(4);
		head.left.left.left = new Node(1);
		head.right.left = new Node(7);
		head.right.left.left = new Node(6);
		head.right.right = new Node(10);
		head.right.right.left = new Node(9);
		head.right.right.right = new Node(11);

		// recursive
		System.out.println("==============recursive==============");
		System.out.print("pre-order: ");
		preOrderRecur(head);
		System.out.println();
		System.out.print("in-order: ");
		inOrderRecur(head);
		System.out.println();
		System.out.print("pos-order: ");
		posOrderRecur(head);
		System.out.println();

		// unrecursive
		System.out.println("============unrecursive=============");
		preOrderUnRecur(head);
		inOrderUnRecur(head);
		posOrderUnRecur1(head);
		posOrderUnRecur2(head);

	}

}

 

判断一棵树是否是完全二叉树

判断一棵树是否为平衡二叉树

判断一棵树是否为满二叉树(有时间补上)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
算法思路: 对于一个节点,如果其左子或右子为空,则其子个数为1,不满足正则二叉树的定义。否则,递归判断其左右子是否为正则二叉树。 具体实现: 1. 根据前序遍历序列和中序遍历序列构造二叉树。 2. 编写一个函数判断当前节点的子是否为正则二叉树,若是,则返回子中节点数量,否则返回-1。 3. 在判断根节点是否为正则二叉树时,若其左右子都为正则二叉树且子节点数量都不为1,则该为正则二叉树。 完整代码如下: ```python # 定义二叉树节点 class TreeNode: def __init__(self, val): self.val = val self.left = None self.right = None class Solution: def buildTree(self, preorder, inorder): if not preorder or not inorder: return None root_val = preorder[0] root = TreeNode(root_val) idx = inorder.index(root_val) root.left = self.buildTree(preorder[1:idx+1], inorder[:idx]) root.right = self.buildTree(preorder[idx+1:], inorder[idx+1:]) return root def isRegularBT(self, root): if not root: return 0 left_cnt = self.isRegularBT(root.left) right_cnt = self.isRegularBT(root.right) if left_cnt == -1 or right_cnt == -1: return -1 if left_cnt == 1 and not root.left or right_cnt == 1 and not root.right: return -1 return left_cnt + right_cnt + 1 def isRegularBinaryTree(self, preorder, inorder): root = self.buildTree(preorder, inorder) if self.isRegularBT(root) == -1: return False else: return True ``` 例如,对于二叉树前序遍历序列为[1, 2, 4, 5, 3, 6, 7],中序遍历序列为[4, 2, 5, 1, 6, 3, 7]的二叉树,可以使用以下代码进行判断: ```python preorder = [1, 2, 4, 5, 3, 6, 7] inorder = [4, 2, 5, 1, 6, 3, 7] s = Solution() print(s.isRegularBinaryTree(preorder, inorder)) ``` 输出结果为True,说明该二叉树是正则二叉树
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值