確かに基礎を見るにはよい問いかもしれない.
深さ優先ではこんな感じだろうか.
#include <iostream> #include <string> using namespace std; typedef struct Node_Struct { int value; struct Node_Struct* l; struct Node_Struct* r; } Node; Node * add(Node* base, int value) { if (base == NULL) { cout << "adding " << value << " to this node" << endl; base = new Node; base->l = base->r = NULL; base->value = value; } else if (base->value > value) { cout << base->value << ">" << value << ".. L" << endl; base->l = add(base->l,value); } else { cout << base->value << "<" << value << ".. R" << endl; base->r = add( base->r, value); } return base; } void dump(const Node* n) { cout << "{" << "value:" << n->value << "}" << endl; } void traverse_r( Node* n ) { if (n == NULL) return; if (n->l != NULL) traverse_r(n->l); dump(n); if (n->r != NULL) traverse_r(n->r); } Node* build_btree( Node* n) { n = add(n, 15); n = add(n, 30); n = add(n, 48); n = add(n, 10); n = add(n, 15); n = add(n, 72); n = add(n, 60); n = add(n, 66); n = add(n, 26); n = add(n, 55); return n; } bool is_btree_d(Node *n, bool decision) { if (n == NULL || decision == false) return decision; if (n->l != NULL && n->r != NULL) { cout << n->l->value << ":" << n->r->value << endl; decision = n->l->value < n->r->value ? true : false; } cout << "movin to l" << endl; decision = is_btree_d(n->l, decision); cout << "moving to r" << endl; decision = is_btree_d(n->r, decision); return decision; } int main() { Node* n = NULL; n = build_btree(n); traverse_r( n ); cout << "is this btree valid? - " << is_btree_d(n, true) << endl; return 0; }
0 件のコメント:
コメントを投稿