Binary tree problems
* Binary tree的资料~ http://cslibrary.stanford.edu/110/BinaryTrees.html
1. Print binary tree in level order
class Node{
public:
Node(int v)
{
value = v;
left = 0;
right = 0;
}
int value;
Node *left;
Node *right;
};
//Print binary tree in level order
void BST::bfs(Node *p)
{
queue<Node *> q;
q.push(p);
q.push(0);
while(q.front() != 0)
{
Node *cur = q.front();
while(cur != 0)
{
cout<<cur->value<<" ";
if(cur->left != 0)
q.push(cur->left);
if(cur->right != 0)
q.push(cur->right);
q.pop();
cur = q.front();
}
q.pop();
q.push(0);
cout<<endl;
}
}
//Implement by two queues. q1 stores the nodes of next level,
//and q2 stores the current level.
void BST::printLevelOrder2q(Node *p)
{
queue<Node *> q1;
queue<Node *> q2;
cout<<p->value<<endl;
q1.push(p->left);
q1.push(p->right);
while(!(q2.empty() && q1.empty()))
{
while(!q1.empty())
{
q2.push(q1.front());
q1.pop();
}
while(!q2.empty())
{
Node *curr = q2.front();
cout<<curr->value<<" ";
if(q2.front()->left != 0)
q1.push(curr->left);
if(q2.front()->right != 0)
q1.push(curr->right);
q2.pop();
}
cout<<endl;
}
}
2. Determine if a binary tree is a Binary search tree (BST).
bool isBST(bsNode *p)
{
static int prev = 0;
if(!p)
return true;
if(isBST(p->left))
{
if(prev <= p->value)
{
prev = p->value;
return isBST(p->right);
}
else
return false;
}
else
return false;
}
3. Height of a binary tree.
int BST::depth(Node *root)
{
if(root == 0)
return 0;
else
{
int rDepth = depth(root->right);
int lDepth = depth(root->left);
return 1 + (rDepth>lDepth ? rDepth : lDepth);
}
}
4. Find kth smallest elment in a BST
Dd inorder traversal and counting the number of reached element, when the counter catch the k then return that element.
int BST::kMin(Node *p, int k)
{
static int count = 0;
if(p != 0)
{
kMin(p->left,k);
++count;
if(count == k)
{
return p->value;
}
kMin(p->right,k);
}
}
5. Binary tree is symmetrical.
bool IsMirror(Node * rootA, Node * rootB)
{
if ( rootA == 0 && rootB == 0 )
return true;
if ( rootA == 0 || rootB == 0)
return false;
return rootA->Value == rootB->Value
&& IsMirror(rootA->Left, rootB->Right)
&& IsMirror(rootA->Right, rootB->Left);
}
bool IsMirror(Node * root)
{
return IsMirror(root->Left, root->Right);
}
6. Lowest Common Ancestor
Node* BST::LCA(Node *root, Node *p, Node *q)
{
if(!root || !p || !q)
return 0;
if(max(p->value ,q->value) < root->value)
return LCA(root->left, p, q);
else if(min(p->value, q->value) > root->value)
return LCA(root->right, p, q);
else
return root;
}
浙公网安备 33010602011771号