二叉树操作

160 阅读3分钟

二叉树

序列化

前序序列化二叉树 一个前序遍历的二叉树,没有子节点的位置使用#来代替,进行反序列化。"1,2,4,#,#,5,7,#,#,8,#,#,3,#,6,9,#,#,#"

public class DeserializeTree {
// 指定字符的位置
   int start = -1;
   private TreeNode 
deserializeTree(String[] tree) {
//每次操作进行+1,操作下一个字符。
      start++;
// 当小于数组长度 并且不等于#情况下创建节点,否则为该节点的孩子节点返回null
      if (start < tree.length && !tree[start].equals("#")) {
//为当前节点创建对象
           TreeNode  node = new TreeNode(Integer.parseInt(tree[start]));
// 为当前节点的左孩子赋值 
          node.left = deserializeTree(tree);
// 为当前节点的右孩子赋值 
          node.right = deserializeTree(tree);
          return node;
      }
      return null;
   } 
   public TreeNode deserialize(String tree) {
// 进行拆分
      String[] treeData = tree.split(","); 
      TreeNode root =    deserializeTree(treeData); 
      return root; 
   }
}

序列化二叉树

反序列化

前序反序列化

"1,2,4,#,#,5,7,#,#,8,#,#,3,#,6,9,#,#,#" 前序遍历是先输出父节点,在输出左孩子节点,在输出右孩子节点。
先读取第一个字符1 为父节点,
初始化左树
读取第二个字符2,为左孩子节点,
读取第三个字符4,为第二个字符的左孩子节点
开始为第四个节点进行赋值
读取第四个字符#,是第三个字符左孩子为空,返回null。
读取第五个字符#,是第三个字符右孩子为空,返回null
回溯到第二个节点,
读取第六个字符5,是第二个节点的右孩子节点
读取第七个字符7,是第六个节点的左孩子节点
...

public class DeserializeTree {
	int start = -1;
	private TreeNode deserializeTree(String[] tree) {
		start++;
		if (start < tree.length && !tree[start].equals("#")) {
			TreeNode node = new TreeNode(Integer.parseInt(tree[start]));
			node.left = deserializeTree(tree);
			node.right = deserializeTree(tree);
			return node;
		}
		return null;
	}
	public TreeNode deserialize(String tree) {
		String[] treeData = tree.split(",");
		TreeNode root = 	deserializeTree(treeData);
		return root;
		
	}
}

二叉树深度

   // Depth 深度
   public static int getDepthTree(TreeNode node) {
      if (node == null) {
          return 0;
      }
      int leftDepth = getDepthTree(node.left);
      int rightDepth = getDepthTree(node.right);
      int depth = Math.max(leftDepth, rightDepth) +1;
      return depth;
   }

是否是满二叉树


   // 判断是否是 满二叉树
   public static boolean isBalanceTree(TreeNode node) {
      if (node == null) {
          // 空树也是一个棵二叉树
          return true;
     }
      int leftDepth = getDepthTree(node.left);
      int rightDepth = getDepthTree(node.right);
      // 左右字数的深度绝对值不能超过1  左右子树都是二叉树

      return Math.abs(leftDepth - rightDepth)<=1 &&isBalanceTree(node.left) && isBalanceTree(node.right);
   }