深度优先的二叉搜索树遍历来设置树的所有值?

时间:2014-10-01 06:17:06

标签: c++ algorithm tree binary-search-tree tree-traversal

所以,我想知道在简单的inorder遍历中设置二叉搜索树的所有值是否容易,我的想法是因为inorder遍历无论如何都会命中所有节点,并按排序顺序保存它们。为什么不把它设置为一个通用的“遍历”函数来设置所有值,以便稍后进行即时访问?

我的问题: 有没有办法优化这个?使用迭代而不是递归(编辑:我知道现在可以使用一堆指针http://en.wikipedia.org/wiki/Tree_traversal#Implementations

我可以修改它(或使用类似的算法)来设置每个节点的后继,前驱或高度吗?

#include<iostream>
#include<list>
using namespace std;

class Node{
public:
    Node* left; 
    Node* right;
    Node* parent;
    int data;
    int level;
    bool isLeafNode;
    bool isLeftChild;
    bool hasLeftChild;
    bool hasRightChild;
    bool hasSibling;

public: Node(int x){
    right=NULL;
    left=NULL;
    parent=NULL;
    data = x;
    level=0;
    isLeafNode=false;
    isLeftChild=true;
    hasLeftChild=false;
    hasRightChild=false;
    hasSibling=false;
    }
};


class BinarySearchTree{
public: 
   Node* root; 
   list<int> inorder;
   int total; //total number of nodes
   int depth; //maximum level of any node in tree. Level of root is zero
   int total_leaf_nodes; //total number of leaf nodes
   int total_non_leaf_nodes;

public: BinarySearchTree(){
    root=NULL; 
    total=0;
    depth=0;
    total_leaf_nodes=0;
    total_non_leaf_nodes=0;
}


    void traverse(Node* p, int level){ //reset inorder, pass (root,0) to call.
           //go left i.e. 'L'
           if(p->left!=NULL) traverse(p->left, level+1);

           //visit Node i.e. 'V'
           total++;
           inorder.push_back(p->data); //pushes to last position
           p->level=level;
           if(level > depth) depth=level;


           if(p->left==NULL && p->right==NULL){
               p->isLeafNode=true;
               total_leaf_nodes++;
           }
           else{
              total_non_leaf_nodes++;
              if(p->left!=NULL)p->hasLeftChild=true;

              if(p->right!=NULL){    
                  p->hasRightChild=true;
                  (p->right)->isLeftChild=false;
              }

              if(p->left!=NULL && p->right!=NULL){
                  (p->left)->hasSibling=true;
                  (p->right)->hasSibling=true;
              }
           }

           //go right i.e. 'R'
           if(p->right!=NULL) traverse(p->right, level+1); 
    }
};

0 个答案:

没有答案