二叉樹系列問題 求二叉樹中最遠節點的距離

2021-07-16 07:02:08 字數 2531 閱讀 8088

求二叉樹中最遠節點的距離,我們首先要對最遠距離有清晰的認識,最遠距離分為以下三類情況

因此我們在計算距離時總要與前一次的距離作比較,只有當此次左右距離之和大於max值才更改max的值,我們可以使用後續遍歷來計算最遠距離,此時時間複雜度為o(n),使用前序遍歷也是可以的,但時間複雜度為o(n*n),綜合比較我們選擇後續遍歷。實現方法寫在乙個搜尋樹中了。

**如下:

#pragma once

#include

#include

<

stack

>

#include

<

queue

>

using namespace std;

//尋找二叉樹中距離最遠的兩個節點

//使用遞迴,儲存上一次最遠距離,和這次節點的左右最長距離比較,取長的距離作為下次遞迴的長度

//使用後序遍歷和前序遍歷都可以結局此問題,但是前序遍歷時間複雜度為o(n*n),而後序遍歷的時間複雜度為o(n),因此選擇後續遍歷

template

struct bsnode

};template

class bstree

~bstree()

{}private:

int treedepth(node* root)

int rfindlongdistance(node* root,int &

max,int &leftlen,int &rightlen)

rfindlongdistance(root->left,max,leftlen,rightlen);

rfindlongdistance(root->right,max,leftlen,rightlen);

leftlen = treedepth(root->left);

rightlen = treedepth(root->right);

return

max> (leftlen + rightlen) ?

max : leftlen + rightlen;

}public:

size_t findlongerdistance()

int maxlen =

0; int leftlen =

0; int rightlen =

0; return rfindlongdistance(_root,maxlen,leftlen,rightlen) +

1; }

public:

void insert(t key)

else

else

if (key < cur->key)

else

}if (parent

->key > key)

else

newnode->

parent

=parent;}}

void print()

_print(_root);

}void _print(node* cur)

else

if (cur->left)

cout << cur->key <<

" ";

if (cur->right)

}node* find(int key)

else

if (cur->key < key)

else

}return

null;

}private:

bsnode* _root;

};

二叉樹如下:

結果如下:

二叉樹如下:

結果如下:

二叉樹如下:

結果如下:

求二叉樹中最遠的距離

分為兩種情況來討論 1 二叉樹中最遠的兩個節點經過根節點,如情況a 2 二叉樹中最遠的兩個節點不經過根節點,在其左子樹或者右子樹中 所以 二叉樹中最遠的距離 左子樹距離根節點最遠的節點 右子樹距離根節點最遠的節點 左子樹中最遠的距離,右子樹中最遠的距離 三者的最大值 include include ...

二叉樹 二叉樹

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

樹 二叉樹 滿二叉樹 完全二叉樹 完滿二叉樹

目錄名稱作用根 樹的頂端結點 孩子當遠離根 root 的時候,直接連線到另外乙個結點的結點被稱之為孩子 child 雙親相應地,另外乙個結點稱為孩子 child 的雙親 parent 兄弟具有同乙個雙親 parent 的孩子 child 之間互稱為兄弟 sibling 祖先結點的祖先 ancesto...