码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树相关

时间:2019-10-07 19:36:02      阅读:82      评论:0      收藏:0      [点我收藏+]

标签:完全   复杂度   pos   个数   ext   时间   高度   sem   节点   

  • 实现二叉树的先序 中序 后序遍历

递归和非递归

//前序
      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 右子树的左边界没有到最后一层----右满

 

二叉树相关

标签:完全   复杂度   pos   个数   ext   时间   高度   sem   节点   

原文地址:https://www.cnblogs.com/bowenqianngzhibushiwo/p/11631497.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!