zoukankan      html  css  js  c++  java
  • 二叉树的遍历

    二叉树的存储结构:

      

    1 struct BinaryTreeNode {
    2         int     val;
    3         BinaryTreeNode *left;
    4         BinaryTreeNode *right;
    5 
    6         BinaryTreeNode(int v, BinaryTreeNode *l = NULL, BinaryTreeNode *r = NULL): 
    7         val(v), left(l), right(r){}
    8     };

    前序遍历:

      根节点->左子树->右子树

      

      递归方法:

      

    1 void PreOrder(BinaryTreeNode* root) {
    2     if (root != NULL) {
    3         std::cout<<root->val;
    4         PreOrder(root->left);
    5         PreOrder(root->right);
    6     }
    7 }

      迭代方法:

      

     1 void PreOrder(BinaryTreeNode* root) {
     2     BinaryTreeNode* p = root;
     3     std::stack<BinaryTreeNode*> s;
     4 
     5     while (p!= NULL || !s.empty()) {
     6         if (p != NULL) {
     7             std::cout<<p->val;
     8             s.push(p);
     9             p = p->left;
    10         } else {
    11             p = s.top();
    12             s.pop();
    13             p = p->right;
    14         }
    15     }
    16 }

    中序遍历:

      左子树->根节点->右子树

      

      递归方法:

      

    1 void InOrder(BinaryTreeNode *root) {
    2     if (root != NULL) {
    3         InOrder(root->left);
    4         std::cout<<p->val;
    5         InOrder(root->right);
    6 
    7     }
    8 }

      迭代方法:

      

     1 void Inorder(BinaryTreeNode* root) {
     2     BinaryTreeNode* p = root;
     3     std::stack<BinaryTreeNode*> s;
     4 
     5     while (p != NULL || !s.empty()) {
     6         if (p != NULL) {
     7             s.push(p);
     8             p = p->left;
     9         } else {
    10             p = s.top();
    11             std::cout<<p->val;
    12             s.pop();
    13             p=p->right;
    14         }
    15     }
    16 }

    后序遍历:

      左子树->根节点->右子树

      

      递归方法:

      

    1 void Postorder(BinaryTreeNode* root) {
    2     if (root != NULL) {
    3         PostorderRecur(root->left);
    4         PostorderRecur(root->right);
    5         std::cout<<root->val;
    6     }
    7 }

      迭代方法:

      因为后序非递归遍历二叉树的顺序是先访问左子树,再访问右子树,最后访问根节点。当用栈来保存节点,必须分清返回根节点时,是从左子树返回的,还是从右子树返回的。所以,使用辅助指针r,其指向最近访问过的节点。

     1 void BinaryTree::Postorder() {
     2     BinaryTreeNode* p = root;
     3     BinaryTreeNode* r = NULL;
     4     std::stack<BinaryTreeNode*> s;
     5 
     6     while (p!= NULL && !s.empty()) {
     7         if (p != NULL) {
     8             s.push(p);
     9             p = p->left;
    10         } else {
    11             p = s.top();
    12             if (p->right != NULL && p->right != r) {
    13                 p = p->right;16             
             } else { 17 s.pop(); 18 std::cout<<p->val<<" "; 19 r = p; 20 p = NULL; 21 } 22 } 23 } 24 }

    层次遍历:

      

     1 void Levelorder() {
     2     BinaryTreeNode *p = root;
     3     std::queue<BinaryTreeNode*> q;
     4 
     5     if (p != NULL) {
     6         q.push(p);
     7     }
     8 
     9     while (!q.empty()) {
    10         p = q.front();
    11         q.pop();
    12         std::cout<<p->val;
    13 
    14         if (p->left != NULL) {
    15             q.push(p->left);
    16         }
    17         if (p->right != NULL) {
    18             q.push(p->right);
    19         }
    20     }
    21 }
  • 相关阅读:
    软件实现的施密特触发器
    激励
    正式搬家,到博客园
    IAR编译器的常见问题
    记正式开始工作
    调度器的介绍
    atmega8 例程:AD中断方式采集
    【IAR警告】Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined
    AD转换器的参数介绍
    影响LIMIT子句使用的一个mysql配置项
  • 原文地址:https://www.cnblogs.com/vincently/p/4215549.html
Copyright © 2011-2022 走看看