所以,我想知道在简单的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);
}
};