CareerCup Chapter 4 Trees and Graphs

struct TreeNode{

int val;

TreeNode* left;

TreeNode* right;

TreeNode(int val):val(val),left(NULL),right(NULL){}

};

Not all binary trees are binary search trees.

4.1 Implement a function to check if a tree is balanced. For the purposes of this question, a balanced tree is defined to be a tree such that no two leaf nodes differ in distance from the root by more than one.

Calculate all node‘s two leaf by recursion, in each recursion, judge its two leaf nodes differ is more than one or not. -1 represents no balanced, and >=0 represents balanced.

int depthAndCheck(TreeNode *root){

if(root==NULL)return 0;

else{

int leftD = depthAndCheck(root->left);

int rightD = depthAndCheck(root->right);

if(leftD==-1||rightD==-1)return -1; //find one node no balanced,then the tree is no balanced.

if(leftD-rightD<=-2||leftD-rightD>=2)return -1; //judge its two children.

return max(leftD,rightD)+1;

}

}

4.2 Given a directed graph, design an algorithm to find out whether there is a route between two nodes.

struct GraphNode{

int val; //value

vector<GraphNode*> next; //directed to nodes

};

Here, two nodes are A and B, we breadth first search the graph at the beginning of A to see whether there is a route from A to B, then breadth first search at the beginning of B to see whether there is a route from B to
A. We declare a set<GraphNode*> to record whether the Node is visited.

bool isHaveRoute(GraphNode *A,GraphNode *B){

if(A==B)return true;

set<GraphNode*>  visited;

list<GraphNode*>  array[2];

int cur=0,pre=1;

array[0].push(A);visited.insert(A);

while(!array[cur].empty()){

cur=!cur;pre=!pre;

array[cur].clear();

while(!array[pre].empty()){

for(int i=0;i<array[pre].front()->next.size();i++){

if(visited.count(array[pre].front()->next[i])==0){

if(array[pre].front()->next[i]==B)return true;

array[cur].push(array[pre].front()->next[i]);

visited.insert(array[pre].front()->next[i]);

}

}

array[pre].pop_front();

}

}

return false;

}

bool isHaveRouteAB(GraphNode *A,GraphNode *B){

if(isHaveRoute(A,B)||isHaveRoute(B,A))return true;

else return false;

}

4.3 Given a sorted (increasing order) array, write an algorithm to create a binary tree with minimal height.

I think the problem is to create a binary search tree with minimal height.

The left child is smaller than the parent and the right child is bigger than the parent. So, we can find the middle of the array, and divide this array to two part, the left part is the left child part of the middle and
the right part is the right child part.

TreeNode* binaryST(int a[],int left,int right){

if(left>right)return NULL;

int mid=left+(right-left)/2;

TreeNode *parent = new TreeNode(a[mid]);

parent->left = binaryST(a,left,mid-1);

parent->right = binaryST(a,mid+1,right);

return parent;

}

TreeNode *resBST(int a[],int n){

if(n<=0)return NULL;

return binaryST(a,0,n-1);

}

4.4 Given a binary search tree, design an algorithm which creates a linked list of all the nodes at each depth (i e , if you have a tree with depth D, you’ll have D linked lists).

BFS,like 4.2.

4.5 Write an algorithm to find the ‘next’ node (i e , in-order successor) of a given node in a binary search tree where each node has a link to its parent.

in-order, first, read the node‘s left, then the node, the the node‘s right.

When the node has right child, the successor will be the left-most child of it‘s right child part.

When the node is a left child,its parent is its successor.

When the node is a right child, traverse its parents until we find a parent that the node is in the left child part of this parent. This parent is the node‘s successor.

TreeNode* findNextNode(TreeNode* root){

if(root!=NULL)

if(root->parent==NULL||root->right!=NULL){

return findLeftMostChild(root->right);

}else{

while(root->parent){

if(root->parent->left==root)break;

root=root->parent;

}

return root->parent;

}

}

return NULL;

}

TreeNode* findLeftMostChild(TreeNode* root){

if(root==NULL)return NULL;

if(root->left)root=root->left;

return root;

}

4.6 Design an algorithm and write code to find the first common ancestor of two nodes in a binary tree.Avoid storing additional nodes in a data structure NOTE: This is not necessarily a binary search tree.

4.7 You have two very large binary trees: T1, with millions of nodes, and T2, with hundreds of nodes Create an algorithm to decide if T2 is a subtree of T1.

we traverse T1 to find a node that equal to T2‘s root, then compare T1 and T2 to find whether T2 is a subtree of T1.

bool isSubTree(TreeNode* T1,TreeNode* T2){

if(T2==NULL)return true;

if(T1==NULL)return false;

if(T1->val==T2->val){

if(isMatch(T1,T2))return true;

}

return isSubTree(T1->left,T2)||isSubTree(T1->right,T2);

}

bool isMatch(TreeNode* T1,TreeNode *T2){

if(T1==NULL&&T2==NULL)return true;

if(T1==NULL||T2==NULL)return false;

if(T1->val!=T2->val)return false;

return isMatch(T1->left,T2->left)&&isMatch(T1->right,T2->right);

}

4.8 You are given a binary tree in which each node contains a value. Design an algorithm to print all paths which sum up to that value. Note that it can be any path in the tree - it does not have to start at the root.

we declare a vector<int> to store one path from root to current node, and traverse this vector to find a path that sum up to the value.

void traverseAllPaths(TreeNode* root,int num,vector<int> buffer,int level){

if(root==NULL)return;

buffer.push_back(root->val);

int temp=num;

for(int i=level;i>=0;i--){

temp-=buffer[i];

if(temp==0)printfPath(buffer,i,level);

}

vector<int> bufferL,bufferR;

for(int i=0;i<buffer.size();i++){

bufferL.push_back(buffer[i]);

bufferR.push_back(buffer[i]);

}

traverseAllPaths(root->left,num,bufferL,level+1);

traverseAllPaths(root->right,num,bufferR,level+1);

}

void printfPath(vector<int> buffer,int begin,int end){

for(int i=begin;i<=end;i++)printf("%d ",buffer[i]);

printf("\n");

}

时间: 2024-11-03 22:09:09

CareerCup Chapter 4 Trees and Graphs的相关文章

【CareerCup】Trees and Graphs—Q4.3

转载请注明出处:http://blog.csdn.net/ns_code/article/details/24744177     题目: Given a sorted (increasing order) array, write an algorithm to create a binary tree with minimal height.     翻译: 给定一个有序数组(递增),写程序构建一棵具有最小高度的二叉树.     思路: 要使二叉树的高度最小,则要尽量使其左右子树的节点数目相

Careercup | Chapter 4

二叉查换树,左孩子小于等于根,右孩子大于根. 完全二叉树,叶子都在最后一层,所有结点(除了叶子)都有两个孩子. 平衡二叉树,左右子树的高度在一定范围内. 4.1 Implement a function to check if a binary tree is balanced. For the purposes of this question, a balanced tree is defined to be a tree such that the heights of the two s

Careercup | Chapter 6

6.3 You have a five-quart jug, a three-quart jug, and an unlimited supply of water (but no measuring cups). How would you come up with exactly four quarts of water? Note that the jugs are oddly shaped, such that filling up exactly "half" of the

Careercup | Chapter 1

1.1 Implement an algorithm to determine if a string has all unique characters. What if you cannot use additional data structures? 字符串问题,需要先确定是不是只有ASCII码. 如果是,可以用char[256],也可以用位向量.位向量的实现参照<编程珠玑>.i&MASK就是取余.i>>SHIFT就是取商. 1 class BitVector {

Careercup | Chapter 5

5.1 You are given two 32-bit numbers, N andM, and two bit positions, i and j. Write a method to insert M into Nsuch that M starts at bit j and ends at bit i. You can assume that the bits j through i have enough space to fit all ofM. That is, ifM= 100

Careercup | Chapter 8

8.2 Imagine you have a call center with three levels of employees: respondent, manager, and director. An incoming telephone call must be first allocated to a respondent who is free. If the respondent can't handle the call, he or she must escalate the

CareerCup chapter 1 Arrays and Strings

1.Implement an algorithm to determine if a string has all unique characters What if you can not use additional data structures? The length of ACSII code of a character is 8, so we can build a array, the length is 260, to represent the hash table of a

Careercup | Chapter 3

3.1 Describe how you could use a single array to implement three stacks. Flexible Divisions的方案,当某个栈满了之后,需要把相邻的栈调整好,这是一个递归的过程. 每个stack有一些属性,所以不妨将每个stack封闭起来,我这里是用一个private的struct来实现,方便,同时对外部又不可见. 对于一些常用的操作,比如环形数组取下一个数,前一个数,都可以封装起来. 1 class XNStack { 2

Careercup | Chapter 7

7.4 Write methods to implement the multiply, subtract, and divide operations for integers. Use only the add operator. 比较简单.但是要封装得好. 7.5 Given two squares on a two-dimensional plane, find a line that would cut these two squares in half. Assume that th