㈠ Java数据结构二叉树深度递归调用算法求内部算法过程详解
二叉树
1
2 3
4 5 6 7
这个二叉树的深度是3,树的深度是最大结点所在的层,这里是3.
应该计算所有结点层数,选择最大的那个。
根据上面的二叉树代码,递归过程是:
f(1)=f(2)+1 > f(3) +1 ? f(2) + 1 : f(3) +1
f(2) 跟f(3)计算类似上面,要计算左右结点,然后取大者
所以计算顺序是f(4.left) = 0, f(4.right) = 0
f(4) = f(4.right) + 1 = 1
然后计算f(5.left) = 0,f(5.right) = 0
f(5) = f(5.right) + 1 =1
f(2) = f(5) + 1 =2
f(1.left) 计算完毕,计算f(1.right) f(3) 跟计算f(2)的过程一样。
得到f(3) = f(7) +1 = 2
f(1) = f(3) + 1 =3
if(depleft>depright){
returndepleft+1;
}else{
returndepright+1;
}
只有left大于right的时候采取left +1,相等是取right
㈡ 鏁版嵁缁撴瀯涓庣畻娉曞ぇ瀛︽病瀛︽槑锏界殑𨱒
鏁版嵁缁撴瀯澶у︾敓镐庝箞瀛︽暟鎹缁撴瀯?浜斿ぇ鑴夌粶锲
鏁版嵁缁撴瀯
鏁版嵁缁撴瀯鏄璁$畻链哄瓨鍌ㄣ佺粍缁囨暟鎹镄勬柟寮忋傛暟鎹缁撴瀯鏄鎸囩浉浜掍箣闂村瓨鍦ㄤ竴绉嶆垨澶氱岖壒瀹氩叧绯荤殑鏁版嵁鍏幂礌镄勯泦钖堛傞氩父𨱍呭喌涓嬶纴绮惧绩阃夋嫨镄勬暟鎹缁撴瀯鍙浠ュ甫𨱒ユ洿楂樼殑杩愯屾垨钥呭瓨鍌ㄦ晥鐜囥
鐩稿叧链璇
鍦ㄦ暟鎹缁撴瀯涓庣畻娉曚腑锛屾暟鎹銆佹暟鎹瀵硅薄銆佹暟鎹鍏幂礌銆佹暟鎹椤规湁涓浜涘悓瀛︽闷涓嶆哕鍏朵腑镄勫叧绯汇傞氲繃鐢讳竴寮犲浘𨱒ユ崑涓鎹:
鏁版嵁涓夎佺礌
鏁版嵁缁撴瀯涓夎佺礌鍒嗕负:阃昏緫缁撴瀯銆佸瓨鍌ㄧ粨鏋勚佹暟鎹镄勮繍绠椼傞昏緫缁撴瀯鍒嗕负绾挎х粨鏋勫拰闱炵嚎镐х粨鏋;瀛桦偍缁撴瀯鍒嗕负椤哄簭瀛桦偍銆侀摼寮忓瓨鍌ㄣ佺储寮曞瓨鍌ㄣ佹暎鍒楀瓨鍌:鏁版嵁杩愮畻鍖呮嫭瀹氢箟鍜屽疄鐜般
鏁版嵁缁撴瀯瀛︿範姝ラ
鍗曢摼琛(甯﹀ご缁撶偣銆佷笉甯﹀ご缁撶偣)璁捐′笌瀹炵幇(澧炲垹鏀规煡)锛屽弻阈捐〃璁捐′笌瀹炵幇
镙堣捐′笌瀹炵幇(鏁扮粍鍜岄摼琛)锛岄槦鍒楄捐′笌瀹炵幇(鏁扮粍鍜岄摼琛)
浜屽张镙戞傚康瀛︿範锛屼簩鍙堟爲鍓嶅簭銆佷腑搴忋佸悗搴忛亶铡嗛掑綊銆侀潪阃掑綊瀹炵幇 锛屽眰搴忛亶铡
浜屽张鎺掑簭镙戣捐′笌瀹炵幇(鎻掑叆鍒犻櫎)
鍫(浼桦厛阒熷垪銆佸爢鎺掑簭)
AVL(骞宠)镙戣捐′笌瀹炵幇(锲涚嶈嚜镞嬫柟寮忕悊瑙e疄鐜)
浼稿𪾢镙戙佺孩榛戞爲铡熺悊姒傚康鐞呜В
B銆丅+铡熺悊姒傚康鐞呜В
鍝埚か镟兼爲铡熺悊姒傚康鐞呜В(璐蹇幂瓥鐣)
鍝埚笇(鏁e垪琛)铡熺悊姒傚康鐞呜В(鍑犵嶈В鍐冲搱甯屽啿绐佹柟寮)
骞舵煡闆/涓岖浉浜ら泦钖(浼桦寲鍜岃矾寰勫帇缂)
锲捐烘嫇镓戞帓搴
锲捐篸fs娣卞害浼桦厛阆嶅巻銆乥fs骞垮害浼桦厛阆嶅巻
链鐭璺寰凞iikstra绠楁硶銆丗loyd绠楁硶銆乻pfa绠楁硶
链灏忕敓鎴愭爲prim绠楁硶銆乲ruskal绠楁硶
鍏朵粬鏁版嵁缁撴瀯绾挎垫爲銆佸悗缂鏁扮粍绛夌瓑
缁忓吀绠楁硶瀛︿範姝ラ
阃掑綊绠楁硶(姹傞桩涔樸佹枑娉㈤偅濂戙佹眽璇哄旈梾棰)
浜屽垎镆ユ垒
鍒嗘不绠楁硶(蹇鎺掋佸綊骞舵帓搴忋佹眰链杩戠偣瀵圭瓑闂棰)
璐蹇幂畻娉(浣跨敤杈冨氾纴鍖洪棿阃夌偣闂棰桡纴鍖洪棿瑕嗙洊闂棰)
甯歌佸姩镐佽勫垝(LCS(链闀垮叕鍏卞瓙搴忓垪) LIS(链闀夸笂鍗囧瓙搴忓垪)鑳屽寘闂棰樼瓑绛
锲炴函绠楁硶(缁忓吀鍏镄囧悗闂棰樸佸叏鎺掑垪闂棰)
浣嶈繍绠楀父瑙侀梾棰(鍙傝冨墤鎸噊ffer鍜孡eetCode闂棰)
蹇阃熷箓绠楁硶(蹇阃熸眰骞备箻銆佺烦阒靛揩阃熷箓)
kmp绛夊瓧绗︿覆鍖归厤绠楁硶
涓鍒囧叾浠栨暟璁虹畻娉(娆у嚑閲屽缑銆佹嫇灞曟у嚑閲屽缑銆佷腑锲藉墿浣椤畾鐞嗙瓑绛)
㈢ 在计算机算法中,迭代和递归是什么意思它们有什么区别
举个例子:我想求1+2+3+4+..+100的值。
迭代的做法:从1到100,顺着往下累加。1+2=3,3+3=6,6+4=10,10+5=15……
程序表示,
int i=1,sum=0;
while(i<=100){
sum = sum +i;
}
递归的做法:我要求1到100的累加值,如果我已经得到1到99的累加值,将这个值加上100就是1到100的累加值;要得到1到99的累加值,如果已经得到1到98的累加值,将这个值加上99,就是1到99的累加值……最后我要得到1到2的累加值,我如果得到1自身累加值,再加上2即可,1自身的累加值显然就是1了。于是现在我们得到了1到2的累加值,将这个值加3就得到了1到3的累加值,……最后直到得到1到100的累加值。
程序表示,其中函数会调用自身,这就是递归方法的典型特征
int GetSum(int n)
{
if(n<=0) return 0;
else return n+GetSum(n-1);
}
上述例子中,其实递归最后得到结果也是用迭代方法完成的,只是在程序的处理上直观看不出来。两者都能很好的完成计算任务,不同之处在于思维方式上,从而导致不同的计算方法:迭代是正向思维,从头到尾思考问题;递归是逆向思维,他假设我们已经得到了部分结果(假设我已经知道了1到99的累加值,把这个值加上100我们就得到了1到100的累加值了),从尾部追溯到头部,从而让问题简化(当然这个例子中看不出来,这里只是方便理解,有兴趣可以参考一下http://ke..com/view/568949.htm 斐波那契数列 的构造方法)。