第五章 数和二叉树 笔记

PS:对于递归实现的前序,中序,后序算法,无非是在递归时,根的访问位置不同而已,代码内容几乎相似。非递归算法实现时,当root指针或栈非空时,先循环考虑root是否为否执行相应的操作,对于栈判断是否为空,进行root的转换。前序,后序,中序的非递归算法区别无非是每棵树的根节点的输出时机不同而已,具体实现大同小异。

1.二叉树的前序遍历-------------------非递归实现算法(伪代码)和递归实现

  非递归实现伪代码:

1.栈s初始化(空栈);
2.循环直到root为空且栈s为空 
 2.1 当root不空时循环
  2.1.1 输出root->data;
     2.1.2 将指针root的值保存到栈中;
     2.1.3 继续遍历root的左子树(root=root->lchild)
 2.2 如果栈s不空,则
  2.2.1 将栈顶元素弹出至root(root=s.pop());
  2.2.2 准备遍历root的右子树(root=root->rchild); 

    代码:

template <class T>
void BiTree::PreOrder(BiNode<T> *root) {
  SeqStack<BiNode<T> *>  s;
     while (root!=NULL | | !s.empty())     {
         while (root!= NULL)         {
             cout<<root->data;
             s.push=root;
             root=root->lchild;  
         }
         if (!s.empty()) { 
             root=s.pop();
             root=root->rchild;  
         }
     }
}

递归实现:

template   <class T>
void   BiTree::PreOrder(BiNode<T> *root) 
{
        if (root ==NULL)  return;     
        else {
            cout<<root->data;         
            PreOrder( root->lchild );    
            PreOrder(  root->rchild);    
        }
 }

2.二叉树的建立伪代码:

1.按前序扩展遍历序列输入输入节点的值
2.如果输入节点之为“#”,则建立一棵空的子树
3.否则,根结点申请空间,将输入值写入数据域中,
4.以相同方法的创建根节点的左子树
5.以相同的方法创建根节点的右子树
递归方法

代码:

template <class T>
BiTree ::BiTree(){ 
      root=creat();
}

template <class T>
BiNode<T> * BiTree ::Creat(){
     BiNode<T> *root; char ch;
    cin>>ch;
    if (ch=='# ')     root=NULL; 
    else {
        root=new BiNode<T>; 
        root->data=ch;
        root->lchild=creat(); 
        root->rchild= creat(); 
    }  
  return root
}

3.

中序遍历---------递归算法

template <class T>
void BiTree::InOrder (BiNode<T> *root)
{
         if (root==NULL) return;     
         else {
               InOrder(root->lchild); 
               cout<<root->data; 
               InOrder(root->rchild);
         }
}

中序遍历--------非递归算法(伪代码):

1.栈s初始化(空栈);
2.循环直到root为空且栈s为空 
 2.1 当root不空时循环
        2.1.1 将指针root的值保存到栈中;
     2.1.2 继续遍历root的左子树(root=root->lchild)
 2.2 如果栈s不空,则
  2.2.1 将栈顶元素弹出至root(root=s.pop());
     2.2.2 输出root->data;
  2.2.3 准备遍历root的右子树(root=root->rchild); 

代码:

template <class T>
void BiTree::InOrderwithoutD(BiNode<T> *root)
{
    stack< BiNode<T> * > aStack;
    while (!aStack.empty() || root)
    {
        while (root) 
        {
            aStack.push(root);
            root = root->lchild;
        }
        if (!aStack.empty())
        {
            root = aStack.top();
            aStack.pop();
            cout << root->data;
            root = root->rchild;
        }
    }
}

4.

后序遍历-----------递归算法

template <class T>
void BiTree::PostOrder(BiNode<T> *root)
{ 
    if (root==NULL) return; 
    else {
         PostOrder(root->lchild); 
         PostOrder(root->rchild); 
         cout<<root->data;          
    }
}

猜你喜欢

转载自www.cnblogs.com/dean-SunPeishuai/p/10674881.html
今日推荐