二叉树相关

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

 

以上是关于二叉树相关的主要内容,如果未能解决你的问题,请参考以下文章

二叉树相关概念

二叉树的相关算法

排序二叉树,平衡二叉树和红黑树的概念以及相关的操作讲解

二叉树的相关知识点

二叉树的建立以及相关操作,平衡二叉树

数据结构树相关代码(数据结构笔试复测Leecode牛客)