二叉树相关
Posted bowenqianngzhibushiwo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树相关相关的知识,希望对你有一定的参考价值。
- 实现二叉树的先序 中序 后序遍历
递归和非递归
//前序 1 2 3 4 5 6 7 依次递归的顺序 1 2 4 4 4 2 5 5 5 2 1 3 6 6 6 3 7 7 7 3 1 打印的时机问题 打印放在第一次出现 先序 打印第二次出现 中序 打印第三次 后续 public static void preOrder(TreeNode root) if(root==null) return; System.out.print(root.val);//先序 preOrder(root.left); //System.out.print(root.val);//中序 preOrder(root.right); //System.out.print(root.val);//后续
非递归
前序
public static void preOrder(TreeNode root) if(root==null) reutrn; Stack<TreeNode> stack=new Stack<>(); if(root!=null) stack.push(root); while(!stack.isEmty()) TreeNode ret=stack.pop(); System.out.println(ret.val+" "); if(ret.right!=null) stack.push(ret.right); if(ret.left!=null) stack.push(ret.left); Systm.out.println();
中序遍历
public static void InOrder(TreeNode root) if(root!=null) Stack<TreeNode >stack-new Stack<>(); while(!isEmpty()||root!=null) if(head!=null) stack.push(head); head=head.left; else head=stack.pop() System.out.print(head.val); head=head.val; Systm.out.println();
后序遍历
左右中
public static void PostOrder(TreeNode root) if(root!=null) Stack<ListNode> stack1=new Stack<>(); Stack<ListNode>stack2=new Stack<>(); stack1.push(root); while(!statck.isEmpty()) root=stack1.pop(); stack2.push(root); if(root.left!=null) stack1.push(root.left); else if(root.right!=null) stack1.push(root.right); while(!stack2.isEmpty()) System.out.print(stack2.pop().val+" ‘); System.out.println();
- 中序 找到二叉树的节点的后继节点
前驱节点
left
right
parent
val
一个节点有右子树,后继节点就是右子树最左的节点
没有右子树 找以x为左节点的根。
public static TreeNode nextNode(TreeNode node) if(node==null) return node; if(node.right!=null) //右子树上最左的节点 node=node.right; while(node.left!=null) node=node.left; return node; else ListNode parent=node.parent; while(parent!=null&&parent.left!=node) node= parent; parent=node.parent; return parent;
前驱节点
public static TreeNode(TreeNode node) if(node==null) return null; if(node.left!=null)//左子树的最右节点 node=node.left; while(node.right!=null) node=node.right; return node; else//以当前节点为右节点的根节点 ListNode parent =node.parent; while(parent!=null&&parent.right!=node) node=parent; parent=node.parent; return parent;
- 序列化和反序列二叉树
先序序列化
1_2_4_#_#_5_#_#_3_6_#_#_7_#_#_
层序序列化
- 平衡二叉树 二叉树递归很好用
左树是否平衡
右树是否平衡
都平衡 左右数高差
设计递归返回函数
(树形dp)
- 搜索二叉树(不含重复节点)
二叉树中序升序就是搜索二叉树BST
- 完全二叉树
有右无左
有左无右 层序遍历后面的所有节点必须都是叶子结点
- 已知一颗完全二叉树,求其节点的个数
时间复杂度低于O(N)
满二叉树高度为L,节点个数2^L -1;
1当前节点的右子树的左边界到了最后一层---左满
2 右子树的左边界没有到最后一层----右满
以上是关于二叉树相关的主要内容,如果未能解决你的问题,请参考以下文章