二叉樹問題總結(三)

2021-07-05 19:43:41 字數 3155 閱讀 4301

問題11:求二叉樹的映象

遞迴解法:

(1)如果二叉樹為空,返回空

(2)如果二叉樹非空,分別求左子樹和右子樹的映象,然後交換左右子樹

binarytreenode* mirror(binarytreenode* proot)

問題12:求二叉樹中兩個節點的最低公共祖先

遞迴解法:

(1)如果兩個節點分別在左子樹和右子樹,返回根節點

(2)如果兩個節點都在左子樹,則遞迴處理左子樹;如果兩個節點都在右子樹,則遞迴處理右子樹

bool findnode(binarytreenode* proot,binarytreenode* pnode)

binarytreenode* getlastcommonparent(bianrytreenode* proot,binarytreenode* pnode1,binarytreenode* pnode2)

}else

}}

遞迴解法效率低,有很多重複的遍歷。

非遞迴解法:

首先求根節點到兩個節點的路徑,然後比較兩個路徑中的節點,

最後乙個相同的節點就是二叉樹中兩個節點的最低公共祖先

bool findpath(binarytreenode* proot,binarytreenode* pnode,list

&path)

path.push(proot);

bool found=false;

found=findpath(proot->m_pleft,pnode,path);

if(!found)

found=findpath(proot->m_pright,pnode,path);

if(!found)

path.pop_back();

return found;

}binarytreenode* getlastcommonparent(binarytreenode* proot,binarytreenode* pnode1,bianrytreenode* pnode2)

else

break;

}return pnode;

}return null;

}

問題13:求二叉樹節點的最大距離

即二叉樹中相距最遠的兩個節點之間的距離

遞迴解法:

(1)如果二叉樹為空,返回0,同時記錄左子樹和右子樹的深度都為0

(2)如果二叉樹不為空,最大距離要麼是左子樹中兩個節點間的最大距離,要麼是右子樹中兩節點間的最大距離,要麼是左子樹到根節點的最大距離+右子樹到根節點的最大距離,同時記錄左子樹和右子樹中節點到根節點的最大距離

int getmaxdistance(binarytreenode* proot,int& maxleft,int& maxright)

int maxll,maxlr,maxrl,maxrr;

int maxdistleft,maxdistright;

if(proot->m_pleft!=

null)

else

if(proot->m_pright!=

null)

else

return

max(max(maxleft,maxright),maxdistleft+maxdistright);

}

二叉樹的謙虛遍歷中,第一元素總是樹的根節點的值。中序遍歷序列中,位於根節點左邊的數為樹的左子樹節點,

位於根節點的右邊的數為樹的右子樹節點

遞迴解法:

(1)如果前序遍歷或者中序遍歷為空,或者節點個數小於等於0,返回空

(2)建立根節點。前序遍歷中的第乙個數為根節點,在中序遍歷中找到根節點的位置,可分別得到左子樹和右子樹的前序遍歷和中序遍歷,重建左右子樹

binarytreenode* rebuildbinarytree(int *ppreorder,int *pinorder,int nodenum)

}if(rootpostioninorder==-1)

throw std::exception("invalid input");

//重建左子樹

int nodenumleft=rootpositioninorder;

int* ppreorderleft=ppreorder+1;

int* pinorderleft=pinorder;

proot->m_pleft=rebuildbinarytree(ppreorderleft,pinorderleft,nodenumleft);

//重建右子樹

int nodenumright=nodenum-rootpositioninorder-1;

int* ppreorderright=ppreorder+rootpositioninorder+1;

int* pinorderright=pinorder+rootpositioninorder+1;

proot->m_right=rebuildbinarytree(ppreorderright,pinorderright,nodenumright);

return proot;

}

問題15:判斷二叉樹是不是完全二叉樹 ( 有點難)

若二叉樹的深度為h,則除第h層外,其他層(1~h-1)的節點都達到了最大個數

在第h層,所有的節點都連續集中在最左邊,這就是完全二叉樹

如下演算法:按層遍歷(從上到下,從左到右)二叉樹,若遇到二叉樹左子樹為空,則右子樹必須為空,如後續遍歷左右子樹不為空,則不是完全二叉樹

bool iscompletebinarytree(binarytreenode* proot)

}else

else

if(pnode->m_pleft!=

null

&&pnode->m_pright==

null)

else

if(pnode->m_pleft==

null

&& pnode->m_pright!=

null)

else}}

return result;

}

二叉樹總結

二叉樹遍歷總結 已知一棵二叉樹的前根序序列和中根序序列,構造該二叉樹的過程如下 1.根據前根序序列的第乙個元素建立根結點 2.在中根序序列中找到該元素,確定根結點的左右子樹的中根序序列 3.在前根序序列中確定左右子樹的前根序序列 4.由左子樹的前根序序列和中根序序列建立左子樹 5.由右子樹的前根序序...

二叉樹(三) 線索二叉樹

對於具有n個結點的二叉樹,二叉鍊錶中空的指標域數目為n 1,如下圖 注 n 1 的推導過程如下 2 n n 1 n 1 利用二叉鍊錶中空的指標域指出結點在某種遍歷序列中的直接前驅或直接後繼。指向前驅和後繼的指標稱為線索,加了線索的二叉樹稱為線索二叉樹。利用鏈結點的空的左指標域存放該結點的直接前驅的位...

二叉樹 二叉樹

題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...