二叉树的实现和四种遍历

简介: 二叉树的实现和四种遍历
#include<iostream> 
#include<queue> 
using namespace std;
struct node{
  int data;
  node *lchild,*rchild;
  int layer;  //存放树的层次
};
node* newnode(int x){   //生成一个新结点 
  node* r=new node;
  r->data=x;
  r->lchild=r->rchild=NULL;
  return r;
}
void insert(node* &root,int x){   
//插入一个结点 ,修改指针地址,需要引用 
  if(root==NULL){
    root=newnode(x);
    return;
  }
  if(x<root->data){       //这里的规则可以修改 
    insert(root->lchild,x);
  }
  else{
    insert(root->rchild,x);
  } 
}
void search(node* root,int x,int newdata) { 
//查找一个值为x的结点并修改其值为newdata ,修改指针指向的值,不需引用 
  if(root->data==x)
  {
    root->data=newdata;
    return; 
  }
  search(root->lchild,x,newdata);
  search(root->rchild,x,newdata); 
}
node * creating(int a[],int n){  //创建二叉树 
  node* root=NULL;
  for(int i=0;i<n;i++)
  insert(root,a[i]);
  return root;  
}
//四个遍历
void preorder(node* root){  //先序遍历 
  if(root==NULL)return;
  printf("%d",root->data);
  preorder(root->lchild);
  preorder(root->rchild);
}
void inorder (node* root){  //中序遍历 
  if(root==NULL)return;
  inorder(root->lchild);
  printf("%d",root->data);
  ineorder(root->rchild);
}
void postorder (node* root){  //后序遍历 
  if(root==NULL)return;
  postorder(root->lchild);
  postorder(root->rchild);
  printf("%d",root->data);
}
void layerorder(node* root) {  //层次遍历并标记层次 
  if(root==NULL)return;
  queue <node*> q;
   //队列保存原元素的一个副本,这里存指针才能修改layer 
  root->layer=0;
  node* temp=root;  
    q.push(temp);
  while(!q.empty()) {
    temp=q.front();q.pop();
    printf("%d",temp->data);
    if(temp->lchild!=NULL){
      temp->lchild->layer=temp->layer+1;//层次标记 
      q.push(temp->lchild); 
    }
    if(temp->rchild!=NULL){
      temp->rchild->layer=temp->layer+1;
      q.push(temp->rchild); 
    }
  }
}
int main()
{
  int a[]={1, 2, 3,4,5,6} ;
  node* s=creating(a,6) ;
  layerorder(s);
  return 0;
}

实际上二叉树的实现和链表的实现大同小异,对比结构,只是其是左右两个指针,所以又称为二叉链表,而链表有静态实现,故二叉树有有静态实现,了解即可。

相关文章
【LeetCode】105. 从前序与中序遍历序列构造二叉树
题目描述: 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 示例:
61 0
|
6月前
|
C++ 索引 Python
leetcode-105:从前序与中序遍历序列构造二叉树
leetcode-105:从前序与中序遍历序列构造二叉树
46 0
|
存储 算法
二叉树的创建和遍历
二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个节点最多只能有两棵子树,且有左右之分
91 0
|
存储 算法
二叉树的三序遍历
简要介绍二叉树的三序遍历和重构和代码实现。
102 0
二叉树四种遍历的实现
二叉树四种遍历的实现
100 0
二叉树的实现(前中后层序四种遍历)
二叉树的实现(前中后层序四种遍历)
54 0
|
机器学习/深度学习 C++ 容器
二叉树创建和遍历(C++实现)
树(Tree)是n(n≥0)个节点的有限集。在任意一棵树中有且仅有一个特定的称为根(Root)的节点;当n>1时,其余节点可分m(m>0)为个互不相交的有限集T1,T2,...,Tm;其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。 二叉树(Binary Tree)是一种特殊的有序树型结构,所有节点最多只有2棵子树。
657 0
二叉树的三种遍历方式
二叉树的三种遍历方式
232 0
二叉树的三种遍历方式
【LeetCode】-- 105. 从前序与中序遍历序列构造二叉树
【LeetCode】-- 105. 从前序与中序遍历序列构造二叉树
135 0
【LeetCode】-- 105. 从前序与中序遍历序列构造二叉树
|
算法 Python
LeetCode 987. 二叉树的垂序遍历
给你二叉树的根结点 root ,请你设计算法计算二叉树的 垂序遍历 序列。
97 0