【1】不用乘法和除法操作符(*、/),实现两个整数的相除
思路:转换为减法操作,简单举例5/2,找到2的小于5的最大倍数4=2*2,5-4=1;1<2,结束,故结果为2。求取倍数可以使用位操作,每次左移等价扩大2倍。
int myDiv_2(unsigned int a,unsigned int b){
unsigned int x,y;
int ans=0;
while(a=b){
x=b;
y=1;
while(a=(x1)){
x=1;
y=1;
}
a-=x;
ans+=y;
}
return ans;
}
【2】一个二叉树,指定其中两个节点,找出他们两个最近的祖先节点
思路1:
获得这颗二叉树的前序序列数组、中序序列数组(内部存节点id或节点指针都行),假设每个节点用id标示
前序数组A,中序B。i=0,j=0;
(1)取A的第一个节点id,i=0,此节点应为当前根节点,在B中搜素此节点,位置j,此节点将B分为左右两部分(即左右两个子树),同时记录左边元素的个数left_n,同时查询左半部分出现两个指定节点的次数。
(2) 若指定的两个节点分别分布在左右两边,则当前的根节点即为最近祖先节点。
(3)如两个节点都在左半边,则都在左子树,i=i+1,B的处理范围改为左半部分,执行(1)
(4)如两个节点都在右半边,则都在右子树,如左边元素个数n==0;则i=i+1,即为又子树根节点;否则i=i+2,即为又子树根节点,B的处理范围改为当前范围的右半部分,
执行(1)。
思路2:采用非递归的后序遍历,借助栈,当当前遍历节点为指定节点时,保存当前栈的内容(即从根节点到本节点的路径),然后找到两个节点路经中最后一个不相同的节点,即为最近的祖先节点。