树
二叉树
1概念:对于每一个节点,拥有的子节点个数称之为这个结点的度, 所有节点的度不超过2的树称之为二叉树 2:每个节点最多只有两个子节点,它的子节点一般称之为左右孩子, 3:具有相同节点深度的二叉树节点位于同一层
完全二叉树:除了最后一层外其他层的节点个数全满,而且最后一层从左到右排满直到最后一个节点,
也就是说按照层序遍历依次数是没有缺口的
满二叉树:所有层节点全满
完全二叉树的存储
1用数组存储
可以以 [0]||[1]来作为根节点建立二叉树,数组[t]的左右孩子位置分别为[2t]与[2t+1],父亲节点为[t/2]
2用结构体存储
1:struct TreeNode{ int value; int lchild,rchild,father TreeNode(int x){ value=x; } }; //用数组来表示 2:struct TreeNode{ int value; TreeNode *lchild,*rchild,*father TreeNode(int x){ value=x; } }; // TreeNode(int x)--获得结构体实例也可以使用类似于 类中构造函数的方法
二叉树的操作
1新建节点:TreeNode *p=new TreeNode(x); 2插入子节点:
void insert(TreeNode *fa,TreeNode *p,int flag){ if(!flag) fa->lchild=p; else fa->rchild=p; p->father=father; } //调用- Tree *p=new TreeNode(value); insert(fa,p,flag);
二叉树的遍历
1:前序遍历
void PreOrder(TreeNode*p){ cout<<p->value<<'\n'; if(p->lchild) PreOrder(p->lchild); if(p->rchild) PreOrder(p->rchild); }
2:中序遍历
void InOrder(TreeNode*p){ if(p->lchild) InOrder(p->lchild); cout<<p->value<<'\n'; if(p->rchild) InOrder(p->rchild); }
3:后序遍历
void PostOrder(TreeNode*p){ if(p->lchild) PostOrder(p->lchild); if(p->rchild) PostOrder(p->rchild); cout<<p->value<<'\n'; }
4:层序遍历-利用队列与bfs思想
TreeNode *q[maxn]; void bfs(TreeNode *root) { int front=1,read=1; q[1]=root; while(front<=rear) { TreeNode *p=q[front]; front++; cout<<p->value<<'\n'; if(p->lchild) q[++rear]=p->lchild; if(p->rchild) q[++read]=p->rchild; } }
5:计算树的深度方法
只需在遍历的过程中,该数的深度+=max(lchild,rchild);