Ch4-1: identify if a tree is "balanced" (注:CTCI 第四版和第五版的定义不一样)

来源:互联网 发布:手机直播源码 编辑:程序博客网 时间:2024/05/29 15:54

To identify if the most different leaves, it is:  If < 1, then balance. otherwise, not.

So we need to traverse the tree to find the leaves' depth, so we pick 1 of 3 traverse oders: the inorder.

In order to implement a tree, need a structure:

struct BinNode{int data;BinNode *parent, *lChild, *rChild;};

Then we can traverse each node and find the depth of each leaf. Read this snippet, very elegant recursion version (although not high efficient as iteration version since large constant coefficient of O(n)). 

Look at the:  ++d, dep[++numLeaf]=d, --d;

// the helper methodint d=0, numLeaf=0, dep[MAX_NUM];void getDep(BinNode* head){if(head == NULL) return;++d;  // key in recursiongetDep(head->lChild);if(head->lChild==NULL && head->rChild==NULL){dep[++numLeaf] = d;  //}getDep(head->rChild);--d;  // key in recursion}

Then we can simply check all the dep[numLeaf] and find the largest, smallest one, and find the difference of them.

Also, as the linked list, we need to implement tree, so we need to initialize it by init() and insert().

The insert() is elegant too.

// very good design of the insert method!void insert(BinNode* &head, int value){if(head==NULL) {//head->data = value;  Hawstein used array to store BSTBST[idx].data = value;BST[idx].parent = p;head = &BST[idx++]; // note, this is post increment return;  // C++ primer P223, this return equal to break};p = head;if(value < head->data)insert(head->lChild, value);elseinsert(head->rChild, value);}

And here is the whole code:


and the output:

Executing the program....$demo 0testing num_a    15: BST[0]3: BST[1]8: BST[2]1: BST[3]4: BST[4]7: BST[5]10: BST[6]2: BST[7]6: BST[8]9: BST[9]11: BST[10]12: BST[11]testing num_a    2data: 100x6018a0


0 0
原创粉丝点击