博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二叉树
阅读量:6567 次
发布时间:2019-06-24

本文共 2853 字,大约阅读时间需要 9 分钟。

1.节点度数不超过2的树称作二叉树

深度为k的节点,之多2^k个

含n个节点,高度为h的二叉树中:h<n<2^(k+1)

n=k+1时,化为一条单链

n=2^(k+1)-1时,为满二叉树

2.二叉树描述多叉树

凡是有根且有序的树,均可以用二叉树描述

首先将多叉树采用firstChild()和nextSibling()方法进行表示

3.二叉树的实现:

BinNode的组成:lChild,parent,rChild,data,height,npl,color

4.计算树的规模(采用递归)

int size(){    int s=1;    if(lChild)        s+=lChild->size();    if(rChild)            s+=rChild->size();    return s;}

5.高度更新

空树的高度为-1

#define stature(p) ((p) ? (p) -> height  :  -1)

任意节点的高度等于其左子树的高度和右子树的高度的较大者加一

int update( x ){    return x->height=1+max(stature(x->lChild), stature(x->rChild));}

更新V及其历代祖先的高度

void updateHightAbove(x){     while(x){          updateHeight(x);          x=x->parent;     }}

6.节点插入算法

7.遍历

先序(V | L | R),中序(L | V | R),后序(L | R | V)

递归实现 void traverse(BinNodePosi(T) x, VST & visit){     if(!x) return;     visit(x->data);     traverse(x->lChild, visit);     traverse(x->rChild, visit);}//T(n)=O(1)+T(a)+T(n-a-1)=O(n)
使用迭代实现先序遍历 思路一:使用栈 void travPre(BinNodePosi(T) x, VST & visit){    Stack
S; if(x) S.push(x); while(!S.empty()){ x=S.pop(); visit(x->data); if(HasRChild(*x)) S.push(x->rChild); if(HasLChild(*x)) S.push(x->lChild); }} java实现: public static void main(String[] args){
  Node header = createTree();      Stack
nodeStack=new Stack
();   if(headler!=null)    nodeStack.push(header);      while(!nodeStack.empty()){
   Node node=nodeStack.pop();    System.out.println(node.getData());    if(node.getRchild()!=null)     nodeStack.push(node.getRchild());    if(node.getLchild()!=null)     nodeStack.push(node.getLchild());   }  } 思路二:首先自顶向下依次访问左侧链的节点,每访问一个节点,将其右节点入栈,然后自底向上的依次访问每个层次上的右子树  public static void travPre(Node x){
  Stack
s=new Stack
();   while(true){
   visitAlongLeftBranch(x,s);    if(s.empty())     break;    x=s.pop();   }  }  public static void visitAlongLeftBranch(Node x,Stack
s){   while(x!=null){    System.out.println(x.getData());    s.push(x.getRchild());    x=x.getLchild();   }  }

 中序遍历

当子树的根被扫描到后,会将其控制权转交到左孩子

public static void travIno(Node x){        Stack
s=new Stack
(); while(true){ goAlongLeftBranch(x,s); if(s.empty()) break; x=s.pop(); System.out.print(x.getData()); x=x.getRchild(); } } public static void goAlongLeftBranch(Node x,Stack
s){ while(x!=null){ s.push(x); x=x.getLchild(); } }

层次遍历:使用队列

根节点先入列,然后取出并访问,将该节点的左、右节点先后入队,如此循环

8.二叉树反向重构

[先序|后序] + 中序

preorder: r     L     R

inorder: L     r     R

思路:首先根据preorder中的r,在inorder找到r的位置并将L和R分解出来,再根据的inorder中的L和R,将preorder的L和R分解出来

[先序+后序] x 真

真二叉树:节点的度为0和2

 

转载于:https://www.cnblogs.com/lvjygogo/p/8552378.html

你可能感兴趣的文章
我的友情链接
查看>>
Hibernate 对象标识符(OID)来区分对象
查看>>
mbr,gpt,开机启动流程.
查看>>
CENTOS下搭建SVN服务器
查看>>
零基础到精通Linux,从这篇文章开始
查看>>
Python最简编码规范
查看>>
grep与正则表达式
查看>>
js模块化编程之CommonJS和AMD/CMD
查看>>
12月26日二周二次【Python基础语法】
查看>>
Android L 新特性
查看>>
学习笔记第十七节课
查看>>
Python 爬取图片链接并且解析
查看>>
初学图论-Bellman-Ford单源最短路径算法
查看>>
初学算法-快速排序与线性时间选择(Deterministic Selection)的C++实现
查看>>
NFS网络文件系统
查看>>
SSH远程管理(用户登录控制及密码验证)
查看>>
java常用类型转换
查看>>
划分vlan,制作trunk口。使同一vlan能互相通讯
查看>>
地理信息系统控件GIS控件TatukGIS Developer Kernel 下载及介绍
查看>>
VIM的snipMate的继承设置
查看>>