二叉树的建立及其前中后序遍历
//二叉树存储结构: struct node { Int data; node *lchild; node *rchild; }; //二叉树在建树前根节点不存在: Node *root = NULL; //新建结点: node *newNode(int v) { node *Node = new node; Node->data = v; Node->lchild = NULL; Node->rchild = NULL; return Node; } //二叉树结点的查找、修改: void search(node *root,int x,int newdata) // 在这里修改的是root指针指向的内容,所以不需要加引用& { if(root == NULL) return; if(root->data == x) root->data = newdata; search(root->lchild,x,newdata); search(root->rchild,x,newdata); } //二叉树的插入: void insert(node *&root,int x) // 这里要加引用,是因为修改的是root指针本身 { if(root == NULL) { root = newNode(x); return root; } if(x<=root->data) // 生成二叉查找树 insert(root->lchild,x); else insert(root->rchild,x); } //二叉树的创建: node *create(int data[],int n) { node *root = NULL; for(int i=0;i<n;++i) insert(root,data[i]); return root; }
二叉树的遍历:
遍历方法一般有四种,先序遍历、中序遍历、后序遍历、层次遍历,前三种的前中后指的是根结点root在遍历中的位置。
void preorder(node *root) // 对于先序遍历,序列第一个一定是根结点 { if(root==NULL) return; cout << root->data; preorder(root->lchild); preorder(root->rchild); } void inorder(node *root) //中序遍历总把根结点放在左子树和右子树中间 { if(root==NULL) return; inorder(root->lchild); cout << root->data; inorder(root->rchild); } void postorder(node *root) //后序遍历中的序列最后一个一定是根结点 { if(root==NULL) return; postorder(root->lchild); postorder(root->rchild); cout << root->data; } void LayerOrder(node *root) //根据题意,原存储结构可能要加入layer记录层数 { queue<node*> q; // 队列中的数据类型是指针,这样可以方便有时层序遍历的时候修改数据 q.push(root); while(!q.empty()) { node *now = q.front(); q.pop(); if(now->lchild!=NULL) q.push(now->lchild); if(now->rchild!=NULL) q.push(now->rchild); } }
推论:中序序列可以与先序序列、后序序列、层序序列中的任意一个来构建唯一的二叉树
例如:先序序列和中序序列搭配:
node *create(int preL,int preR,int inL,int inR) // preL,preR是先序序列的区间 { if(preL>preR) //先序序列长度小于等于0时,直接返回 return NULL; node *root = new node; root->data = pre[preL]; int k; for(k=inL;i<=inR;++i) { if(in[k]==pre[preL]) break; } int num = k-inL; // num是左子树结点个数 root->lchild = create(preL+1,preL+num,inL,k-1); root->rchild = create(preL+num,preL+num+1,k+1,InR); return root; }