二叉树相关操作

来源:互联网 发布:js初始化数组并赋值 编辑:程序博客网 时间:2024/04/20 02:44

1.先序遍历(递归)

void PreOrder(Node* root){    if(root==NULL) return;    visit(root);    PreOrder(root->lchild);    PreOrder(root->rchild);}


2.先序遍历(非递归)

void PreOrder(Node *root){    if(root==NULL) return;    Node *p=root;    stack<Node*>s;    while(p!=NULL||!s.empty()){        visit(p);        s.push(p);        p=p->lchild;    }    if(!s.empty()){        p=s.top()->rchild;        s.pop();    }}

3.中序遍历(递归)

void InOrder(Node* root){    if(root==NULL) return;    InOrder(root->lchild);    visit(root);    InOrder(root->rchild);}


4.中序遍历(非递归)

void InOrder(Node *root){    if(root==NULL) return;    Node *p=root;    stack<Node*>s;    while(p!=NULL||!s.empty()){        s.push(p);        p=p->lchild;    }    if(!s.empty()){        p=s.top()->rchild;        visit(p);        s.pop();    }}

5.后续遍历(递归)

void PostOrder(Node* root){    if(root==NULL) return;    PostOrder(root->lchild);    PostOrder(root->rchild);    visit(root);}

6.层序遍历

void LevelTranverse(Node *root){    if(root==NULL) return;    queue<Node*>q;    q.push(root);    while(!q.empty()){        visit(q.front());        q.pop();        if(root->lchild) q.push(root->lchild);        if(root->rchild) q.push(root->rchild);    }}

7.求总的节点数

int sum(Node *root){    if(root==NULL) return 0;    else 1+sum(root->lchild)+sum(root->rchild);}

8.求度为0的节点(即叶子结点)个数

int sum(Node *root){    if(root==NULL) return 0;    else if(root->lchild==NULL&&root->rchild==NULL) return 1;    else return sum(root->lchild)+sum(root->rchild);}

9.求度为1的节点个数

int sum(Node *root){    if(root==NULL) return 0;    else if(root->lchild==NULL&&root->rchild!=NULL||root->rchild==NULL&&root->lchild!=NULL) return 1;    else return sum(root->lchild)+sum(root->rchild);}

10.求度为2的节点个数

int sum(Node *root){    if(root==NULL) return 0;    else if(root->lchild!=NULL&&root->rchild!=NULL) return 1;    else return sum(root->lchild)+sum(root->rchild);}

11.求树的高度

int high(Node *root){    if(root==NULL) return 0;    int n1=high(root->lchild),n2=high(root->rchild);    return max(n1,n2)+1;}

12.求x所在的层数

int level(Node *root,int x){    if(root==NULL) return 0;    else if(root->data==x) return 1;    else{        int c1=level(root->lchild,x);        if(c1>=1) return c1+1;        int c2=level(root->rchild,x);        if(c2>=1) return c2+1;    }    return 0;}

13.输出二叉树的第level层

int level_out(Node *root,int level){    if(root==NULL) return;    if(level==1) visit(root);    else{        level_out(root->lchild,level-1);        level_out(root->rchild,level-1);    }}