二叉树
二叉树性质:
- 二叉树第i层至多有pow(2,i-1)个节点;
- 深度为k的二叉树最多有pow(2,i)-1个节点
- n=n0+n1+n2;n-1=n1*2n2;------->n0=n2+1;
- 具有n个节点的深度为pow(log2,n)+1
- i=0,左孩子为2i+1,右孩子为2i+2;i=1,左孩子为2i,右孩子为2i+1
层序存储,先序存储,先中后序遍历
#include <bits/stdc++.h> using namespace std; typedef char ElemType; #define MaxSize 100 //二叉链表的结构创建 typedef struct BiTNode{ ElemType data; struct BiTNode *lchild; struct BiTNode *rchild; }BiTNode,*BiTree; //层序遍历的方式创建二叉树 string tree; CreateTreeSeqTraverse(BiTree &T,int i,int n){ if(i>=n||i<0) T=NULL; else{ T=(BiTree)malloc(sizeof(BiTNode)); if(!T) return 0; T->data=tree[i]; CreateTreeSeqTraverse(T->lchild,2*i+1,n); CreateTreeSeqTraverse(T->rchild,2*i+2,n); } } //前序创建二叉树 CreateTreePreTraverse(BiTree &T){ char c; scanf("%c",&c); if(c=='#') T=NULL; else{ T=(BiTree)malloc(sizeof(BiTNode)); if(!T) return 0; T->data=c; CreateTreePreTraverse(T->lchild); CreateTreePreTraverse(T->rchild); } } //前序遍历 void PreOrderTraverse(BiTree T){ if(T==NULL) return; printf("%c ",T->data); PreOrderTraverse(T->lchild); PreOrderTraverse(T->rchild); } //中序遍历 void OrderTraverse(BiTree T){ if(T==NULL) return; OrderTraverse(T->lchild); printf("%c ",T->data); OrderTraverse(T->rchild); } //后序遍历 void PosOrderTraverse(BiTree T){ if(T==NULL) return; PosOrderTraverse(T->lchild); PosOrderTraverse(T->rchild); printf("%c ",T->data); } int main(){ BiTree T; getline(cin,tree); CreateTreeSeqTraverse(T,0,tree.length()); PosOrderTraverse(T); }