目录
1.二叉树
2.搜索二叉树:
3.满二叉树:
4.平衡二叉树
1.二叉树
先、中、后序遍历
先序(中、左、右):1,2,4,5,3,6,7
中序(左、中、右):4,2,5,1,6,3,7
后序(左、右、中):4,5,2,6,7,3,1
void f(Node head)
{
if(head==null)
{return;}
f(head.left);
f(head.right);
}
//先序遍历(中、左、右)
void preOrderRecur(Node head)
{
if(head==null){
return;
}
cout<<head.value<<endl;
preOrderRecur(head.left);
preOrderRecur(head.right);
}
//中序遍历(左、中、右)
void InOrderRecur(Node head)
{
if(head==null){
return;
}
InOrderRecur(head.left);
cout<<head.value<<endl;
InOrderRecur(head.right);
}
//后序遍历(左、右、中)
void PosOrderRecur(Node head)
{
if(head==null){
return;
}
PosOrderRecur(head.left);
PosOrderRecur(head.right);
cout<<head.value<<endl;
}
1,2,4,4,4,2,5,5,5,2,1,3,6,6,6,3,7,7,7,3,1
先序:打印第一次遇到
中序:打印第二次遇到
后序:打印第三次遇到
void inorderunrecur(node head)
{
if(head!=null)
stack<node> stack= new stack<node>():
node cur=head;
while(!stack.isEmpty()||cur!=null)
{
if(cur!=null)
{
stack.push(cur); //1.进栈
cur=cur.left;
}
else
{
cur= stack.pop();//2.栈中弹出
cur= cur.right; //3.右子树弹出
}
}
打印二叉树
二叉树的宽度优先遍历
void process(Node head)
{
if(head==null)
{
return;
}
Queue<Node> queue= new LinkedList<>();//创建双向链表
queue.add(head);
while(!queue.isEmpty()) //如果队列不为空
{
Node cur=queue.poll(); //弹出就打印
count<<cur.value<<endl;
if(cur.left!=null) //有左孩子
{
queue.add(cur.left);
}
if(cur.right!=null) //有右孩子
{
queue.add(cur.right);
}
}
}
void main()
{
process(head);
}
怎么求一个二叉树的最大宽度
//1.构造树
1
2 3
4 5 6 7
8 9 10
void main(String[] args) {
Node head = new Node(1);
head.left = new Node(2);
head.right = new Node(3);
head.left.left = new Node(4);
head.left.right = new Node(5);
head.right.left = new Node(6);
head.right.right = new Node(7);
head.left.right.right = new Node(8);
head.right.left.left = new Node(9);
head.right.riht.right = new Node(10);
process(head);
}
添加节点的层数:
void process(Node head)
{
if(head==null)
{
return;
}
HashMap<Node,Int> levelMap = new HashMap<>; //层数表
Queue<Node> queue= new LinkedList<>(); //创建双向链表
levelMap.put(head,1);
queue.add(head);
int clevel=1; //当前层数
int cnodes=0; //每层的个数
int max=0; //最大值
while(!queue.isEmpty())
{
Node cur=queue.poll(); //弹出就打印
int level=levelMap.get(cur)
if(level==clevel)
{
cnodes++;
}
else
{
if(cnodes>max)
{
max=cnodes;
}
clevel++;
cnodes=1;
}
count<<cur.value<<level<<endl;
if(cur.left!=null) //有左孩子
{
levelMap.put(cur.left,level+1);
queue.add(cur.left);
}
if(cur.right!=null) //有右孩子
{
levelMap.put(cur.right,level+1);
queue.add(cur.right);
}
}
cout<<clevel<<cnodes<<endl;
max= Math.max(max,cnodes);
return max;
}
二叉树的递归套路(经典)
2.搜索二叉树:
左树节点小,右树都大。 中序遍历:左中右,依次递增,那么就是搜索二叉树。
满足条件:
1.左子树整体是搜索二叉树。
2.右子树整体是搜索二叉树。
3.左树上的最大值小于head。
4.右树上的最小值大于head。
class Node
{
public:
int value;
Node left;
Node right;
Node(int data)
{
int value=data;
}
}
//左小,右大
class Info{
public:
bool isBST;//是否是搜索二叉树
int min; //最小值
int max; //最大值
}
以x为head 返回3个信息
Info process(Node x)
{
if(x==null)
{
}
//1.遍历左右两颗树
Info leftData= process(x.left);
Info rightData=process(y.left);
//2.更新左树和右树的最大最小值
int min=x.value;
int max=x.value;
if(leftData!=null){
min=Math.min(min,leftData.min);
max=Math.max(max,leftData.max);
}
if(rightData!=null){
min=Math.min(min,rightData.min);
max=Math.max(max,rightData.max);
}
//3.左右两边是否是搜索二叉树呢
bool isBST =false;
//左树是搜索二叉树 左树最大值小于我
//右树是搜索二叉树 右树最小值大于我
if((leftData!=null ?(leftData.isBST && leftData.max<x.value):true)
&&(rightData!=null ?(rightData.isBST && rightData.min>x.value):true))
{
isBST =true;
}
}
bool isBSTTest(Node x)
{
Info info=process(head);
return info.isBST;
}
3.满二叉树:
判断条件:n=2^h-1
class Node
{
public:
int value;
Node left;
Node right;
Node(int data)
{
int value=data;
}
};
//个数和高度
class Info{
public:
int nodes; //个数
int height; //高度
Info(int n,int h)
{
nodes=n;
height=h;
}
};
以x为head 返回3个信息
Info process(Node x)
{
if(x==null)
{
return new Info(0,0);
}
//遍历左右两颗树
Info leftData= process(x.left);
Info rightData=process(y.left);
int nodes;
int height;
int nodes=leftInfo.nodes+rightInfo.nodes+1;
int height=Math.max(leftInfo.height,rightInfo.height)+1;
return new Info(nodes,height);
};
bool isFull(Node head)
{
Info info=process(head);
int N =info.nodes;
int h=info.height;
//N=2^H-1
return N==(1<<H)-1;
}
4.平衡二叉树
左树跟右树的高度差不超过1
class Node
{
public:
int value;
Node left;
Node right;
Node(int data)
{
int value=data;
}
};
//个数和高度
class Info{
public:
bool isBalanced;
int height;
Info(bool is,int h)
{
isBalanced=is
height=h;
}
};
以x为head 返回3个信息
Info process(Node x)
{
if(x==null)//空树
{x
return new Info(true,0);
}
//遍历左右两颗树
Info leftInfo= process(x.left);
Info rightInfo=process(x.right);
bool isBalanced;
int height;
height=Math.max(leftInfo.height,rightInfo.height)+1;
//左树平
//右树平
//高度差值绝对值<2
bool isBalanced=leftInfo.isBalanced && rightInfo.isBalanced &&
Math.abs(leftInfo.height-rightInfo.height)<2;
return new Info(isBalanced,height);
};
bool isBalanced(Node head)
{
Info info=process(head);
return info.isBalanced;
}