读书笔记
这一章主要介绍了树,二叉树,二叉查找树,AVL树,并查集,堆,哈尔曼树。
树
根节点置于最上方,然后向下延伸出若干条边到达子节点。而子节点又向下延伸出边连接一些节点。直至到达叶子节点。
树的性质(注意对应的英文哟)
① 树可以没有结点。这种情况把树称为空树empty tree
② 树的层次layer:从根结点开始算起。即根节点为第一层,
③把结点的子树棵树称为结点的度degree。而树中最大的度称为树的度
④对与n个结点的树,边数一定是n-1
⑤叶子结点被定义为度为0的结点,因此当树中只有一个结点时,根结点也算是叶子结点
⑥结点的深度depth是指从根节点(深度为1)开始自顶而下逐层累加至该结点时的深度值。
⑦结点的高度height是指从最底层叶子节点(高度为1)开始自底而上累加至该结点时的高度值
求树深度和高度
这个是我自己加的,虽然很简单
树的深度和高度是一样的。
int maxDepth(struct node* node){
if(node == NULL) //base case 基准情况
return 0;
int ldepth = maxDepth(node->lchild); //求左子树的深度
int rdepth = maxDepth(node->rchild); //求右子树的深度
return ldepth>rdepth?++ldepth:++rdepth; //比较那个值大,并加上父亲节点,1
}
PAT 里树题的输入
PAT里树题的输入有一种是下面这样的。使用’-'表示空结点。
这个时候要用字符串去读取。如果用字符:那么数字不能读入(比如15.)如果用int,那么-不能读入。
string child1,chidl2;
cin>>child1>>child2;
if(child1[0]!='-'){
do something;
}
if(child2[0]!='-'){
do something;
}
二叉树
二叉树的定义是递归的:二叉树由根节点,左子树和右子树构成。且左子树,右子树都是二叉树。
满二叉树和完全二叉树
满二叉树:每一层的结点个数都达到了当层能达到的最大结点树。
完全二叉树:除了最后一层,其他层都达到了当层所能达到的最大结点数。且最下面一层只从左至右连续存在若干结点。
对应的定义,插入,删除等操作我就不一一记录了。
二叉树的遍历
遍历方法有:先序遍历,中序遍历,后序遍历和层次遍历。而先序遍历,中序遍历,后序遍历代表着DFS的思想。层次遍历代表着BFS的思想。
也可以这么说:先序遍历是:根左右。中序遍历是左根右。后序遍历是左右根。
先序遍历
void preorder(Node* root){
if(root==NULL)
return;
//do something
preorder(root->lchild);
preorder(root->rchild);
}
中序遍历
void inorder(Node* root){
if(root==NULL)
return;
inorder(root->lchild);
//do something
inorder(root->rchild);
}
后序遍历
void postorder(Node* root){
if(root==NULL)
return;
postorder(root->lchild);
postorder(root->rchild);
//do something
}
层序遍历
void layerorder(Node* root){
queue<Node*> q;
q.push(root);
while(!q.empty()){
Node* now=q.front();
q.pop();
//do something
if(now-<