数和二叉树(最近更新于11/28)

基本术语

树是n个结点的有限集合当n=0时称为空树,任意一颗非空树满足以下条件

1.有且仅有一个特定的称为根的节点。

2.当n>1时除根结点之外的其余节点被分成m个互不相交的有限集合T1,T2,。。。Tm;其中每个集合又是一棵树并称为这个根节点的子树。

结点的度·树的度:某结点所拥有的子树的个数称为该节点的度;树中各节点的度的最大值称为该树的度。

叶子节点分支节点:度为0的结点称为叶子结点,也称为终端节点度不为零的结点称为分支结点也称为非终端结点。

孩子双亲兄弟:某结点子树的根节点称为该结点的孩子结点,反之称为该节点的双亲结点,具有同一个双亲的孩子结点互称为兄第结点。

路径路径长度:一个点到另一个节点的边数成为路径长度这条路叫做路径

祖先子孙:从x到y有一条路径那么x就称为y的祖先,y称为x的子孙

结点的层数树的深度:根结点的层数为1某结点在k层则子结点在k+1层,树中所有结点的最大层数称为该树的深度。

有序树,无序树:如果一棵树中结点的各子树从左到右是有次序的即如果交换了各子树的相对位置则构成不同的树这棵树就是有序树否则就是无序树。

二叉树就是每个节点的孩子最多有两个的树 而且可以通过先序和中序确定后序序列

#include<iostream>
#include <algorithm>
#include <cstdio>
#include <string.h>
#include <string>
using namespace std;
string a,b;
void dfs(int l,int r ,int po){
    if(po>=a.size())
        return ;
    char c=a[po];
    if(l==r){
        cout<<a[po];
        return ;
    }
    if(l>r)
        return;
    int i;
    for(i=l;i<=r;i++)
        if(b[i]==c)
            break;
    dfs(l,i-1,po+1);
    dfs(i+1,r,i-l+1+po);
    cout<<c;
}
int main(){
    while(cin>>a>>b){
        dfs(0,b.size()-1,0);
        cout<<endl;
    }
    return 0;
}

二叉链表 

#include <iostream>
#include <cstdio>
#include <string>
#include <string.h>
#include <cstring>
#include <algorithm>
#include <map>
#include <set>
using namespace std;
char c[9000];
struct Node{
    char data;
    Node *lson,*rson;
};
struct linkdou{
    Node *first;
    linkdou(){
        first=new Node;
        first=dfs();
    }
    Node* dfs(){
        Node *x;
        x=new Node;
        x->lson=NULL;
        x->rson=NULL;
        char c;
        cin>>c;
        if(c=='#')
            return NULL;
        else
        {
            x->data=c;
            x->lson=dfs();
            x->rson=dfs();
        }
        return x;
    }//这里构造函数递归构造#代表已经没有子树了这样才能返回先构造完子树再把子树的根节点作为儿子返回
    void qianxu(Node *x){
        if(x!=NULL){
            cout<<x->data;
            qianxu(x->lson);
            qianxu(x->rson);
        }
    }
    void zianxu(Node *x){
        if(x!=NULL){

            zianxu(x->lson);
            cout<<x->data;
            zianxu(x->rson);
        }
    }
    void hianxu(Node *x){
        if(x!=NULL){

            hianxu(x->lson);

            hianxu(x->rson);
            cout<<x->data;
        }
    }


};

顺序存储 设当前节点在数组中存储的下表为K 则左孩子就是2*K右孩子2*K+1;

二叉树的遍历

前序中序后序遍历层次遍历,层次遍历需要队列类似广度优先搜索,前序中序后序指的是访问根节点的次序,前序遍历指的就是先遍历根节点在访问左子树右子树,中序后序同理。

树、森林与二叉树的转化

树与森林的转化类似儿子兄弟表示法,转化的方法为,如果这个节点有左兄弟就把这个点和他的左兄弟连接起来然后把他和他父亲之间的树枝断开,以此类推这样一棵树就会形成一个根节点没有右儿子的树(一开始没有右儿子,自然不操作它。一开始有右儿子它就变成了左儿子的儿子)。这样就可以讨论森林的合并了,先把每一棵树都按上述方法转化为二叉树,这样根节点就都是只有左儿子的之后就可以依次把后面的二叉树的根节点作为前面二叉树的右儿子连接起来。要是将二叉树还原的话就倒过来操作就行了。先拆树再拆儿子!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值